[英]How to run clojure from matlab
How can I run a clojure script from matlab? 如何从matlab运行clojure脚本?
I tried following: run matlab with jdk 1.7 and then call java 我试过以下:用jdk 1.7运行matlab然后调用java
MATLAB_JAVA=/usr/lib/jvm/java-7-oracle/jre matlab
in the matlab, set classpath and use clojure compiler 在matlab中,设置classpath并使用clojure编译器
javaaddpath([pwd '/lib/clojure-1.5.1.jar'])
import clojure.lang.RT
Here I got error: 我在这里得到错误:
Error using import
Import argument 'clojure.lang.RT' cannot be found or cannot be imported.
When I writing java class that runs clojure, everything working from console, but whould not run from matlab. 当我编写运行clojure的java类时,一切都在从控制台运行,但是不能从matlab运行。 please advice. 请指教。
It looks like this is a problem with Clojure not being happy running from Matlab's "dynamic classpath". 看起来这是一个问题,Clojure不喜欢从Matlab的“动态类路径”运行。 I got the same error with Matlab R2014a on OS X 10.9, using either the bundled JVM or Java 1.7.0u51. 我在OS X 10.9上使用捆绑的JVM或Java 1.7.0u51在Matlab R2014a上遇到了同样的错误。 But if I add clojure-1.5.1.jar
to the static classpath by putting it in a custom javaclasspath.txt
in the Matlab startup directory, then the Clojure classes become visible. 但是如果我将clojure-1.5.1.jar
添加到静态类路径中,方法是将它放在Matlab启动目录中的自定义javaclasspath.txt
中,那么Clojure类就会变得可见。
>> version -java
ans =
Java 1.7.0_51-b13 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
>> cloj = clojure.lang.RT
cloj =
clojure.lang.RT@77de6590
You use the "class path hacking" approach in this answer to add entries to the static classpath from the Matlab command line and not have to muck around with a custom Matlab setup. 您在此答案中使用“类路径黑客”方法从Matlab命令行向静态类路径添加条目,而不必使用自定义Matlab设置。 The answer there involves writing a new Java class, but you can do the equivalent in pure M-code. 答案就是编写一个新的Java类,但你可以在纯M代码中做同等的事情。
function javaaddpathstatic(file)
%JAVAADDPATHSTATIC Add an entry to the static classpath at run time
%
% javaaddpathstatic(file)
%
% Adds the given file to the STATIC classpath. This is in contrast to the
% regular javaaddpath, which adds a file to the dynamic classpath.
%
% Files added to the path will not show up in the output of
% javaclasspath(), but they will still actually be on there, and classes
% from it will be picked up.
%
% Caveats:
% * This is a HACK and bound to be unsupported.
% * You need to call this before attempting to reference any class in it,
% or Matlab may "remember" that the symbols could not be resolved.
% * There is no way to remove the new path entry once it is added.
parms = javaArray('java.lang.Class', 1);
parms(1) = java.lang.Class.forName('java.net.URL');
loaderClass = java.lang.Class.forName('java.net.URLClassLoader');
addUrlMeth = loaderClass.getDeclaredMethod('addURL', parms);
addUrlMeth.setAccessible(1);
sysClassLoader = java.lang.ClassLoader.getSystemClassLoader();
argArray = javaArray('java.lang.Object', 1);
jFile = java.io.File(file);
argArray(1) = jFile.toURI().toURL();
addUrlMeth.invoke(sysClassLoader, argArray);
So, use this javaaddpathstatic()
instead of javaaddpath()
and your code might work. 因此,使用此javaaddpathstatic()
而不是javaaddpath()
,您的代码可能会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.