问题描述
如何从matlab运行clojure脚本?
How can I run a clojure script from matlab?
我试过以下:
运行matlab与jdk 1.7然后调用java
I tried following:run matlab with jdk 1.7 and then call java
MATLAB_JAVA=/usr/lib/jvm/java-7-oracle/jre matlab
在MATLAB中,设置类路径并使用clojure编译器
in the matlab, set classpath and use clojure compiler
javaaddpath([pwd '/lib/clojure-1.5.1.jar'])
import clojure.lang.RT
p>
Here I got error:
Error using import
Import argument 'clojure.lang.RT' cannot be found or cannot be imported.
当我编写运行clojure的java类时,一切从控制台工作,但不能从matlab运行。
请咨询。
When I writing java class that runs clojure, everything working from console, but whould not run from matlab.please advice.
推荐答案
看起来这是一个问题,Clojure不是从Matlab的 。我有同样的错误与Matlab R2014a在OS X 10.9,使用捆绑的JVM或Java 1.7.0u51。但是如果我把 clojure-1.5.1.jar
添加到一个自定义的 javaclasspath.txt
在Matlab启动目录中,则Clojure类变得可见。
It looks like this is a problem with Clojure not being happy running from Matlab's "dynamic classpath". I got the same error with Matlab R2014a on OS X 10.9, using either the bundled JVM or Java 1.7.0u51. 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.
>> 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
破解Java类路径
您在从Matlab命令行添加条目到静态类路径,而不必使用自定义Matlab设置。答案是写一个新的Java类,但是你可以在纯M代码中做同样的事。
Hacking the Java classpath
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. The answer there involves writing a new Java class, but you can do the equivalent in pure M-code.
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);
因此,使用 javaaddpathstatic()
javaaddpath()
,您的代码可能会正常工作。
So, use this javaaddpathstatic()
instead of javaaddpath()
and your code might work.
这篇关于如何从matlab运行clojure的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!