Ошибки MCC компилятора Matlab при импорте классов Java из динамического пути классов Java - PullRequest
2 голосов
/ 10 февраля 2012

Как мне получить mcc для распознавания импорта из предоставленных пользователем библиотек Java или просто для игнорирования неразрешимого импорта?

У меня есть база кода Matlab, которую я создаю с помощью компилятора Matlab, носборка ломается, потому что mcc выдает ошибку, когда встречает операторы import для классов Java, которые были в JAR-файлах в динамическом пути к классам Matlab.Я включаю все файлы JAR в classpath с параметром mcc -a.Код работает в IDE, и я думаю, что он будет работать в развернутом приложении, если он только позволит мне собрать.(Работает под R2009b, который игнорирует этот импорт в классах не-MCOS.)

Вот простое повторение.Этот файл находится в том же каталоге, что и guava-11.0.1.jar из Google Guava.

%file hello_world_with_import.m
function hello_world_with_import
import com.google.common.base.Stopwatch;
disp('Hello, world!');
end

Запуск его в Matlab работает нормально.Но построить его не удается.(javaaddpath здесь не является строго необходимым в примере, потому что плохой импорт сам по себе не является ошибкой в ​​простом Matlab. Просто показывает, как это работает на практике, и как я хочу, чтобы mcc подобрал его.)

>> javaaddpath('guava-11.0.1.jar');
>> hello_world_with_import()
Hello, world!
>> mcc -m -a guava-11.0.1.jar hello_world_with_import
Error: File: C:\Temp\import_test\hello_world_with_import.m Line: 3 Column: 8 
Arguments to IMPORT must either end with ".*" 
 or else specify a fully qualified class name: "com.google.common.base.Stopwatch" fails this test. 
Unable to determine function name or input/output argument count for function  
in MATLAB file "hello_world_with_import".  
Please use MLINT to determine if this file contains errors. 
Error using mcc
Error executing mcc, return status = 1 (0x1).

Это в Matlab R2011b на Windows.


Некоторые сведения о моем окружении.Мое приложение имеет около 40 JAR-файлов на динамическом пути к классам, которые представляют собой смесь сторонних библиотек и нашего собственного кода Java.Он развернут более чем на 50 пользователей на однопользовательских и многопользовательских компьютерах с Windows.Есть и другие группы, которые могут развертывать другие приложения MCR для тех же пользователей и машин.На любой машине разные приложения MCR могут запускаться одновременно одним и тем же или разными пользователями.Мы делаем еженедельные выпуски, и (в основном из-за изменений в нашем собственном Java-коде), по крайней мере, один JAR-файл изменяется во всех остальных выпусках.Мне нужен механизм, который будет работать в этой среде.


Есть предложения?Кто-нибудь знает хороший способ заставить mcc добавить материал в его путь к классу Java на этапе компиляции, или просто игнорировать фиктивный импорт?Мой запасной план состоит в том, чтобы пройти через кодовую базу и удалить все импорты для классов Java, что является проблемой.


ОБНОВЛЕНИЕ 12/2/2012: я слышал от MathWorks, что это исправлено вMatlab R2012b.(Но я больше не использую Matlab, поэтому не могу лично проверить его.)

ОБНОВЛЕНИЕ 12/09/2014: я снова использую Matlab (R2014b), и теперь компилятор Matlab включает в себя JAR-файлы, которыена динамическом пути к классам в динамическом пути к классам скомпилированной программы.Похоже, он не включает автоматически файлы JAR в архив;Вы должны вручную включить их, используя ключ командной строки mcc, или добавить их как «дополнительные включенные файлы» в приложение Matlab Compiler.

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Код, выполняемый в MATLAB IDE, работает, потому что файл java guava был добавлен в «динамический» путь к классам с помощью метода javaaddpath.Однако при использовании MCC для вызова компилятора MATLAB он не зависит от динамического пути к классу Java, а от «статического» пути к классу Java , который определен в:

$MATLABROOT / toolbox / local / classpath.txt

Если вы добавите сюда запись для вашего JAR-файла, MCC сможет разрешить строку IMPORT в вашем M-файле.

Итак, , чтобы проверить это, я скачал файл java гуавы и попробовал описанные выше шаги.Работает как шарм.

Кроме того, если вы прочитали раздел «Устранение неполадок» для компилятора MATLAB, эта точная ситуация будет документирована:

http://www.mathworks.com/help/toolbox/compiler/brtm1xm-8.html

Цитирование по ссылке: «Оператор импорта ссылается на класс Java (), который не может найти компилятор MATLAB (если ошибка возникает во время компиляции) или MCR (если ошибка возникает во время выполнения).

КомуЧтобы обойти эту проблему, убедитесь, что файл JAR, содержащий класс Java, хранится в папке, которая находится в пути к классам Java (см. matlabroot / toolbox / local / classpath.txt для пути к классам.) Если ошибка возникает при запускевремя пути к классу сохраняется в файле matlabroot / toolbox / local / classpath.txt при работе на компьютере разработчика. "

1 голос
/ 24 октября 2012

Вы просто должны поместить операторы импорта в отдельный файл .m.

от:

javaaddpath 'c:\some.jar';
import com.something.Element;
...interesting stuff...

Будет do_imports.m:

import com.something.Element;

И в оригинале .m:

javaaddpath 'c:\some.jar';
do_imports
...interesting stuff...

И тогда он будет компилироваться и работать. Нет необходимости возиться с общесистемными путями классов.

0 голосов
/ 10 февраля 2012

Вот выдержка из ссылки http://blogs.mathworks.com/desktop/2009/07/06/calling-java-from-matlab/

MATLAB поддерживает путь для классов Java отдельно от пути поиска. Это означает, что даже если у вас есть файл .class или .jar в пути MATLAB, если вы не используете javaaddpath, вы не сможете его использовать. Чтобы увидеть, что в данный момент находится на пути, используйте javaclasspath. Запустив эту команду, вы увидите длинный список файлов, поставляемых вместе с matlab, который называется Static Class Path, и затем вы увидите Dynamic Class Path. Динамический путь к классу - это место, куда будут добавлены классы, добавленные к пути с помощью javaaddpath. Они могут быть удалены с помощью javarmpath и должны активно перезагружаться каждый сеанс matlab.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...