我正在尝试使用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/

10-09 19:12