3

matlab から clojure スクリプトを実行するにはどうすればよいですか?

私は次のことを試しました:jdk 1.7でmatlabを実行してからJavaを呼び出します

MATLAB_JAVA=/usr/lib/jvm/java-7-oracle/jre matlab

matlab でクラスパスを設定し、clojure コンパイラを使用する

javaaddpath([pwd '/lib/clojure-1.5.1.jar'])
import clojure.lang.RT

ここでエラーが発生しました:

Error using import
Import argument 'clojure.lang.RT' cannot be found or cannot be imported. 

clojure を実行する Java クラスを作成すると、すべてがコンソールから機能しますが、matlab からは実行できません。ご意見をお聞かせください。

4

1 に答える 1

6

これは、Clojure が Matlab の「動的クラスパス」からの実行に満足していないことに問題があるようです。バンドルされている JVM または Java 1.7.0u51 を使用して、OS X 10.9 の Matlab R2014a で同じエラーが発生しました。しかし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

Java クラスパスのハッキング

この回答の「クラスパス ハッキング」アプローチを使用して、Matlab コマンド ラインから静的クラスパスにエントリを追加し、カスタム Matlab セットアップをいじる必要はありません。そこでの答えは、新しい 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);

したがって、javaaddpathstatic()代わりにこれを使用するjavaaddpath()と、コードが機能する可能性があります。

于 2014-03-20T05:22:22.080 に答える