2010-12-07 2 views
7

Я использую MATLAB R2007b, Java 1.6 SE, Eclipse Helios и MySql 5 для Windows XP Pro SP3.Java JPA Class для MATLAB

Я пытаюсь создать библиотеку классов, которая использует аннотации JPA для доступа к базе данных MySql 5. Идея заключается в том, что скрипт MATLAB создает экземпляры этих объектов Java, которые предоставляют API для доступа к БД.

Я могу создать свои аннотированные классы, которые работают в Eclipse (т. Е. Тест JUnit). Я могу экспортировать код в банку, которую я могу запустить из командной строки.

Я обновляю путь класса Java MATLAB, используя javaaddpath(). Я могу создать экземпляр класса в MATLAB. Но когда я называю Init(), который вызывает javax.persistence.Persistence.createEntityManagerFactory(), я получаю страшный

«Нет поставщика Persistence для EntityManager»

Эта ошибка обычно означает, что файл persistence.xml находится не в нужном месте. Но это должно быть потому, что моя банка работает из командной строки. Добавление папки META-INF в путь к Java-пути MATLAB не помогает. Также не извлекает банку и не добавляет извлеченную структуру папок к пути к классам, добавляется или нет META-INF.

Есть ли у кого-нибудь идеи, ореховые или нет? Кто-нибудь когда-либо делал это в любой версии MATLAB.

Спасибо.

-reilly.

+0

У вас есть постоянный провайдер на пути к классам? – willcodejavaforfood 2010-12-07 13:04:09

+0

Рассмотрите возможность модернизации Matlab. R2007b старый, а встроенная JVM - Java 1.5. Вероятно, это не вызывает этой проблемы, но это может сделать вашу другую разработку более плавной. – 2010-12-07 15:05:20

+0

Попытка 2010a. Тот же вопрос. – Reilly 2010-12-07 18:13:47

ответ

0

Вы абсолютно уверены, что вы видите имя единицы сохранения правильно в вызове:

javax.persistence.Persistence.createEntityManagerFactory(String puName) 

Это также дало бы вам ту же ошибку. Это имя чувствительно к регистру.

+0

Да. Имя единицы продолжительности жестко закодировано в моем классе Java, поэтому одно и то же значение передается независимо от того, запущен ли я из MATLAB или из java в командной строке. – Reilly 2010-12-07 13:13:48

2

Убедитесь, что у вас есть банкомат поставщика JPA (например, eclipselink.jar) на пути к классу.

+0

+1 Это хороший кандидат. Matlab управляет собственным пути Java-класса, поэтому он не обязательно будет таким же, как и команда командной строки «java». Начиная с R2010b, Matlab не поставляется с javax.persistence, поэтому вам нужно предоставить JAR для него, а также JAR с вашими собственными классами. – 2010-12-07 15:01:14

8

Ну, я нашел «ответ». Где-то еще до того, как я увидел сообщение о различии в «динамическом» и «статичном» процессорах MATLAB. «Static» cp - это текстовый файл, загружаемый при запуске. «Динамический» cp загружается во время выполнения, и вы обычно манипулируете им с помощью вызовов m-script. Это то, что я пытался сделать.

Итак, я добавил свои баночки к динамическому пути, и это не сработало.

Я добавил их в конец статического пути и получил РАЗЛИЧНЫЕ ошибки, которые, как представляется, относятся к синтаксическому анализу XML. Прогресс!

Затем я добавил свои баночки в НАЧАЛО статического пути, и он работает.

Процитировать Барт Симпсон: Craptackular.

Спасибо за все ваши идеи. Задайте мне вопрос C#, чтобы я мог отвечать взаимностью ...

-reilly.

8

При работе с Java в MATLAB я часто сталкивался с проблемами с динамическим путём . В качестве обходного пути использование classpath.txt решило проблему до сих пор.

Работа с различными средами, например тестирование и производство, приводит к нескольким classpath.txt файлам в вашем стартовом каталоге MATLAB. Использование разных выпусков MATLAB добавляет еще один множитель к числу файлов classpath.txt.

ClassPathHacker.java является возможностью добавления динамически классов и фляги файлов в статических классов. Используя этот подход, больше не нужно касаться classpath.txt. Ваша конфигурация пути Java-класса может оставаться в предполагаемом месте startup.m.

3

Это просто ответ на ваш вопрос о статических и динамических классах. Вот функция, которая позволит вам диагностировать, где Java-класс загружается из Matlab, и если есть какая-либо маскировка определений классов, из-за чего он был чувствителен к заказу для вас. Вы можете увидеть другие столкновения; по крайней мере dom4j.jar и commons-collections.jar поставляются с Matlab, но я не знаю, какие версии.

function whereisjavaclassloadingfrom(ClassName) 
%WHEREISJAVACLASSLOADINGFROM Show where a Java class is loaded from 
% 
% whereisjavaclassloadingfrom(ClassName) 
% 
% Shows where a Java class is loaded from in this Matlab session's JVM. 
% This is for diagnosing Java class load problems, such as classpath 
% ordering issues, seeing if a class of a given name is included in an 
% unexpected JAR file, etc. 
% 
% Displays output to console. 
% 
% Examples: 
% 
% whereisjavaclassloadingfrom('java.util.HashMap') 
% whereisjavaclassloadingfrom('com.ldhenergy.etools.MxUtil') 
% whereisjavaclassloadingfrom('com.google.common.collect.Maps') 
% whereisjavaclassloadingfrom('org.apache.commons.math.complex.Complex') 

% Use javaArray to get Class object without having to instantiate. This 
% lets it work with objects that have private or non-zero-arg constructors, 
% and avoids side effects of object construction. 
% (Would use java.lang.Class.forName(), because that's a more direct way of 
% doing this, but it doesn't work for stuff on the dynamic classpath.) 
ja = javaArray(ClassName,1); 
klass = ja.getClass().getComponentType(); 

klassLoader = klass.getClassLoader(); 
if isempty(klassLoader) 
    % JVM used null to represent the "bootstrap" class loader 
    % I think that's the same as the "system" class loader 
    klassLoader = java.lang.ClassLoader.getSystemClassLoader(); 
end 
klassLoaderStr = char(klassLoader.toString()); 

klassFilePath = [strrep(ClassName, '.', '/') '.class']; 
try 
    % This logic assumes that the classes exist as files in the class 
    % loader. It's a valid assumption for mainstream class loaders, 
    % including the one's I've seen with Matlab. 
    klassUrl = klassLoader.getResource(klassFilePath); 
    if isempty(klassUrl) 
     klassUrlStr = ''; 
    else 
     klassUrlStr = char(klassUrl.toString()); 
    end 
catch err 
    klassUrlStr = sprintf('ERROR: %s', err.message); 
end 

% Get all locations, to reveal masked definitions 
urls = enumeration2array(klassLoader.getResources(klassFilePath)); 

disp(sprintf('Version: %s\nClass:  %s\nClassLoader: %s\nURL:   %s', version,... 
    char(klass.getName()), klassLoaderStr, klassUrlStr)); 
if numel(urls) > 1 
    disp('Class is masked:'); 
    for i = 1:numel(urls) 
     disp(sprintf('URL %d:  %s', i, char(urls(i)))); 
    end 
end 

%% 
function out = enumeration2array(jenum) 
tmp = {}; 
while jenum.hasMoreElements() 
    tmp{end+1} = jenum.nextElement(); 
end 
out = [tmp{:}];