简体   繁体   English

如何从matlab运行clojure

[英]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

Hacking the Java classpath 破解Java类路径

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM