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コンパイラアプリで「追加のインクルードファイル」として追加する必要があります。