我正在尝试使用来自spmd
内的第三方Java库的类,但我一直收到与导入它相关的各种错误。
这是一个相当小的例子:
spmd (1)
javaaddpath([pwd 'lib/guava-10.0.1.jar']);
import com.google.common.collect.MinMaxPriorityQueue;
pq = MinMaxPriorityQueue.create();
end
这给了我错误
??? Error: MATLAB cannot determine whether "MinMaxPriorityQueue" refers to a
function or variable.
See <a href="matlab: helpview([docroot
'/toolbox/distcomp/distcomp_ug.map'],'SPMD_LIMITATIONS')">SPMD in MATLAB,
"Limitations"</a>.
(当然,that "Limitations" document似乎没有任何特别相关的内容。)
将javaaddpath
和/或import
移到spmd
块之外无济于事;在没有import
的情况下执行此操作,而只是说pq = com.google.common.collect.MinMaxPriorityQueue.create
会导致它出现与com
相同的错误。
调用spmd
块之外定义的匿名函数会产生不同的错误:
javaaddpath([pwd '/lib/guava-10.0.1.jar']);
make_pq = @() com.google.common.collect.MinMaxPriorityQueue.create();
spmd (1)
javaaddpath([pwd '/lib/guava-10.0.1.jar']);
pq = make_pq();
end
让我
The class "com.google.common.collect.MinMaxPriorityQueue" is undefined.
Perhaps Java is not running.
但是Java肯定在运行,因为
spmd (1)
pq = java.util.PriorityQueue();
end
和
spmd (1)
javaaddpath([pwd '/lib']);
pq = ArrayPriorityComparator.create();
end
work(ArrayPriorityComparator
是./lib
)中的独立java类。
这对我来说就像Matlab解析spmd
块一样。但我不认为我可以使用javaObject()
或javaMethod()
来解决它,因为我必须调用一个静态方法来创建对象,我不能把它放在{{{ 1}}因为我得到eval
(或者,如果我把它放在Transparency violation error
之外定义的匿名函数中,我会得到相同的spmd
错误。
有什么想法吗?真正的解决方案或可怕的糟糕黑客都是受欢迎的。
答案 0 :(得分:2)
我想这是另一个'动态类路径'问题。有关如何使用'static classpath'的信息,请参阅Bringing Java Classes and Methods into MATLAB Workspace。
如果您不依赖静态类路径,请使用以下帖子中描述的方法。
答案 1 :(得分:0)
您是否尝试过使用pctRunOnAll
来设置java路径?
我担心我没有一个方便的集群来测试是否可行。