我正在尝试使用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
工作(
ArrayPriorityComparator
是./lib
中的独立java类)。在我看来,这就像Matlab解析
spmd
块的问题。但是我认为我不能使用javaObject()
或javaMethod()
来解决它,因为我必须调用静态方法来创建对象,而且我不能仅仅将其扔到eval
中,因为我得到了Transparency violation error
(或者,如果将其放在spmd
之外定义的匿名函数中,则会出现相同的class is undefined
错误)。有任何想法吗?真正的解决方案或可怕的骇客都欢迎。
最佳答案
我猜这是另一个“动态类路径”问题。有关如何使用“静态类路径”的信息,请参见Bringing Java Classes and Methods into MATLAB Workspace。
如果您不依赖静态类路径,请使用以下文章中描述的方法。
MATLAB finds persistence.xml for eclipselink only within the first few seconds
Java JPA Class for MATLAB
关于java - Matlab:在spmd中使用第三方Java类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8331487/