2

mccユーザー提供のJavaライブラリからのインポートを認識したり、解決できないインポートを単に無視したりするにはどうすればよいですか?

MatlabコンパイラでビルドしているMatlabコードベースがありますが、Matlabの動的クラスパス上のJARにあるJavaクラスのステートメントmccが検出されるとエラーが発生するため、ビルドが壊れています。importオプションを使用して、クラスパス上のすべてのJARファイルを含めていmcc -aます。コードはIDEで機能します。ビルドのみが許可される場合は、デプロイされたアプリでも機能すると思います。(非MCOSクラスでのこれらのインポートを無視するR2009bで動作します。)

これが簡単な再現です。このファイルは、GoogleGuavaのguava-11.0.1.jarと同じディレクトリにあります。

%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).

これは、Windows上のMatlabR2011bにあります。


私の環境に関するいくつかの背景。私のアプリの動的クラスパスには、サードパーティのライブラリと独自のJavaコードを組み合わせた約40個のJARがあります。シングルユーザーとマルチユーザーのWindowsマシンが混在する50人以上のユーザーに展開されます。また、同じユーザーとマシンに他のMCRアプリを展開している可能性のある他のグループがあります。どのマシンでも、同じユーザーまたは異なるユーザーが異なるMCRアプリを同時に実行できます。毎週リリースを行い、(主に独自のJavaコードの変更により)少なくとも1つのJARファイルが他のすべてのリリースについて変更されます。この環境で機能するメカニズムが必要です。


助言がありますか?mccコンパイルステップでjavaクラスパスに何かを追加する良い方法を知っている人はいますか、それとも偽のインポートを無視するだけですか?私のフォールバックプランは、コードベースを調べて、Javaクラスのすべてのインポートを削除することです。これは一種の苦痛です。


UPDATE 12/2/2012:MathWorksから、これはMatlabR2012bで修正されていると聞きました。(ただし、Matlabは使用しなくなったため、個人的に確認することはできません。)

更新2014年12月9日:Matlabを再び使用しています(R2014b)。Matlabコンパイラには、コンパイルされたプログラムの動的クラスパスの動的クラスパスにあるJARが含まれるようになりました。ただし、JARファイルがアーカイブに自動的に含まれるようには見えません。コマンドラインスイッチを使用して手動で含めるmccか、Matlabコンパイラアプリで「追加のインクルードファイル」として追加する必要があります。

4

3 に答える 3

4

guava jarファイルがjavaaddpathメソッドを介して「動的」クラスパスに追加されているため、MATLABIDEで実行されるコードは機能します。ただし、MCCを使用してMATLABコンパイラを呼び出す場合、動的なJavaクラスパスではなく、次のように定義された「静的な」Javaクラスパスに依存します。

$ MATLABROOT / toolbox / local / classpath.txt

ここにJARファイルのエントリを追加すると、MCCはMファイルのIMPORT行を解決できるようになります。

そこで、これをテストするために、guava jarファイルをダウンロードして、上記の手順を試しました。チャームのように機能します。

また、MATLABコンパイラの「トラブルシューティング」セクションを読むと、この正確な状況が文書化されています。

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

リンクからの引用:「importステートメントは、MATLABコンパイラ(コンパイル時にエラーが発生した場合)またはMCR(実行時にエラーが発生した場合)が検出できないJavaクラス()を参照しています。

これを回避するには、Javaクラスを含むJARファイルがJavaクラスパス上にあるフォルダーに格納されていることを確認してください。(クラスパスについては、matlabroot / toolbox / local / classpath.txtを参照してください。)実行時にエラーが発生した場合、開発マシンで実行すると、クラスパスはmatlabroot / toolbox / local/classpath.txtに保存されます。」

于 2012-02-10T02:39:43.900 に答える
2

importステートメントを別の.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...

そして、それはコンパイルされて動作します。システム全体のクラスパスをいじくり回す必要はありません。

于 2012-10-24T10:26:55.823 に答える
-1

これは、リンクhttp://blogs.mathworks.com/desktop/2009/07/06/calling-java-from-matlab/からの抜粋です。

MATLABは、検索パスとは別にJavaクラスのパスを維持します。つまり、MATLABパスに.classまたは.jarファイルがある場合でも、javaaddpathを使用しない限り、それを使用することはできません。現在パス上にあるものを確認するには、javaclasspathを使用します。このコマンドを実行すると、静的クラスパスと呼ばれるmatlabに付属するファイルの長いリストが表示され、次に動的クラスパスが表示されます。動的クラスパスは、javaaddpathを使用してパスに追加されたクラスが配置される場所です。それらはjavarmpathで削除でき、matlabの各セッションをアクティブにリロードする必要があります。

于 2012-02-09T23:42:12.257 に答える