Я пытаюсь использовать класс из сторонней библиотеки Java из spmd
, но продолжаю получать различные ошибки, связанные с его импортом.
Вот довольно минимальный пример:
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>.
(Конечно, , что документ "Ограничения" , похоже, не имеет ничего особенно релевантного.)
Перемещение 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
- этоавтономный класс Java в ./lib
).
Мне кажется, что это проблема с синтаксическим анализом Matlab блока spmd
.Но я не думаю, что могу использовать javaObject()
или javaMethod()
, чтобы обойти это, так как мне нужно вызвать статический метод для создания объекта, и я не могу просто бросить его в eval
, потому что я получаюTransparency violation error
(или, если я помещу это в анонимную функцию, определенную вне spmd
, я получу ту же ошибку class is undefined
).
Есть идеи?Реальные решения или ужасные ужасные хаки приветствуются.