2010-12-07 11 views
7

Windows XP Pro SP3でMATLAB R2007b、Java 1.6 SE、Eclipse Helios、およびMySql 5を使用しています。MATLABのJava JPAクラス

JPAアノテーションを使用してMySql 5データベースにアクセスするクラスライブラリを作成しようとしています。 MATLABスクリプトは、これらのJavaオブジェクトをインスタンス化し、DBにアクセスするためのAPIを提供します。

Eclipse内で動作する注釈付きクラス(JUnitテスト)を作成できます。私は、コマンドプロンプトから実行できるjarにコードをエクスポートすることができます。

私は、MATLAB Javaクラスパスをjavaaddpath()を使用して更新します。 MATLAB内でクラスをインスタンス化できます。しかし、私は私のinit(呼び出したとき)、(javax.persistence.Persistence.createEntityManagerFactoryを呼び出す)、私は恐ろしい

「EntityManagerのための持続性なし・プロバイダー」を取得していない

にこのエラーは通常、そのpersistence.xmlファイルを意味し、正しい場所にいません。しかし、それは私の瓶がコマンドラインから動作するためでなければなりません。 MATLAB JavaクラスパスにMETA-INFフォルダを追加しても役立ちません。 META-INFが追加されたかどうかにかかわらず、jarを抽出し、抽出されたフォルダ構造をクラスパスに追加することもありません。

誰でもアイデアがありますか? MATLABのどのバージョンでも誰でもこれをやったことがありますか?

ありがとうございました。また、あなたと同じエラーを与えるだろう

javax.persistence.Persistence.createEntityManagerFactory(String puName) 

+0

クラスパスに永続プロバイダがありますか? – willcodejavaforfood

+0

Matlabのアップグレードを検討してください。 R2007bは古いもので、組み込みJVMはJava 1.5です。これはおそらくこの問題を引き起こすものではありませんが、他の開発をよりスムーズに進めるかもしれません。 –

+0

2010aを試しています。同じ問題。 – Reilly

答えて

0

は、あなたがへの呼び出しで正しく永続性ユニットの名前を綴られていることを絶対的に確信しています。名前は大文字と小文字が区別されます。

+0

はい。永続ユニットの名前はJavaクラスでハードコードされているため、MATLABから実行しても、コマンドラインでjavaから実行しても、同じ値が渡されます。 – Reilly

2

クラスパスにJPAプロバイダのjar(eclipselink.jarなど)があることを確認します。

+0

+1これは良い候補です。 Matlabは独自のJavaクラスパスを管理しているので、必ずしもコマンドラインの "java"コマンドが見るものと同じではありません。 R2010bでは、Matlabにはjavax.persistenceが付属していないため、JARと独自のクラスをJARに追加する必要があります。 –

+0

ここで私は私のMATLABのクラスパス上に持っているものです: – Reilly

+0

ANTLR-2.7.6.jar com.barronassociates.auspex.rotorcraft.jar コモンズ・コレクション-3.1.jar dom4j.jar EJB3-persistence.jar hibernate3.jarを 休止状態-annotations.jarを 休止状態-コモンズ-annotations.jar 休止状態-core.jar 休止状態-entitymanager.jar javassist.jar jta.jarを組み込み のmysql-コネクタのjava-5.1.7-bin.jarを slf4j- api-1.5.6.jar slf4j-simple-1.5.6.jar – Reilly

8

まあ、私は答えを見つけました。私が前にMATLABの "動的"と "静的" cpの違いについての記事を見ました。 「静的」cpは起動時に読み込まれるテキストファイルです。実行時に "ダイナミック" cpが読み込まれ、通常はmスクリプト呼び出しでそれを操作します。それが私がやろうとしていたことです。

私は動的パスにjarファイルを追加しても動作しませんでした。

静的パスの最後にそれらを追加し、DIFFERENTエラーが発生しました。これはXML解析に関係しているようです。進捗!

次に、私は静的パスの始まりに自分のjarファイルを追加しました。

バート・シンプソンの言葉を引用すると:Craptackular。

あなたのアイデアをお寄せいただきありがとうございます。私にC#の質問をして、私は往復することができます。

-reilly。

+0

+1 "craptacular" –

+3

意味があります - 静的クラスパスはシステムクラスに対応していますsloader;動的なクラスパスはカスタムのMatlab URLClassLoaderを使って行われます。静的クラスパス上のAPIクラスは、動的クラスパスにロードされたクラス定義を「参照」できないため、クラスを仮想化する必要があるJAX-WSなどのAPIは問題にも使用できます。 JPAにはおそらく同じ問題がありました。静的なクラスパスを変更している場合は、Matlabインストール自体でclasspath.txtを編集する代わりに、Matlabを起動しているディレクトリでカスタムclasspath.txtを使用できます。メンテナンスが簡単です。 –

+1

ありがとう、アンドリュー。私は自分のclasspath.txtについて知らなかった。それがこの問題の主な苦情を処理します。 – Reilly

8

MATLABでJavaを使用しているときに、動的クラスパスに関する問題が頻繁に発生しました。回避策として、classpath.txtを使用してこれまでの問題を解決しました。

テストや生産など、さまざまな環境を扱うと、MATLABの開始ディレクトリに複数のclasspath.txtファイルが作成されます。 MATLABの別のリリースを使用すると、classpath.txtファイルの数に別の乗数が追加されます。

ClassPathHacker.javaはあなた静的クラスパスに動的クラスとJARファイルを追加するオプションです。この方法を使用すると、もうclasspath.txtに触れる必要はありません。あなたのJavaクラスパス設定は、意図した場所にとどまることができますstartup.m

+0

+1これは非常に便利ですね!私のMatlabアプリケーションは実際にこれらの環境を持っています。x nmatlabversionsこれらのカスタムファイルとは異なるスタートアップディレクトリです。これは本当に物事を簡素化することができます。 –

3

これは、静的対動的クラスパスの回答に対する単なるフォローアップです。ここでは、Matlab内からJavaクラスがロードされている場所を診断したり、クラス定義のマスキングがあると診断したりすることができる関数があります。あなたは他の衝突を見るかもしれません。少なくとも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{:}];