12

MATLAB は、ユーザーが変更可能な動的パスを検索する前に静的 Java クラス パスを検索するように構成されています。残念ながら、静的パスにはかなりの数の非常に古い公開ライブラリが含まれているため、新しいバージョンを使用しようとすると、間違った実装をロードしてエラーが発生する可能性があります。

たとえば、静的パスには google-collections.jar の古いコピーが含まれています。これは、長い間 Google の guava ライブラリに取って代わられ、同じクラス名 (com.google.common.base.Objects など) がいくつかあります。その結果、そのようなクラスの 1 つの新しいメソッドを使用する Guava メソッドを呼び出すと、google-collections jar が最初に見つかるため、驚くべき NoSuchMethodErrors が返されます。

R2012b の時点で、MATLAB では、設定フォルダーに javaclasspath.txt ファイルを配置することにより、静的パスに追加する追加の jar を指定できますが、パスの末尾に jar が追加され、ビルドされた jar をオーバーライドすることはできません。 MATLAB に。

それで、これを回避する最善の方法は何ですか?

4

4 に答える 4

13

Mathworks から公式の回答を得ました。

MATLAB R2013a (R2012b も同様) では、javaclasspath.txt に次の行を含めることで、静的 Java クラス パスの前にクラスを追加できます。

<before>

javaclasspath.txt のこの行より後のディレクトリは、静的 Java クラス パスの先頭に追加されます。これは、R2013a の時点で、ドキュメント化されていない javaclasspath.txt の使用です。

しかし、MATLAB 全体として、MATLAB 8.0 (R2012b) では javaclasspath.txt を介してクラスを静的 Java クラスパスの先頭に追加する機能を使用できません。

MATLAB は、次の順序で classpath.txt を検索します。

  1. 起動ディレクトリ内。MATLAB 8.0 (R2012b) 以降、ファイルが見つかった場合は警告が表示され、無視されます。

  2. MATLABPATH 環境変数の最初のディレクトリ。(この環境変数は Linux の bin/matlab シェル スクリプトで使用され、一般にエンド ユーザーは使用しません)。

  3. ツールボックス/ローカル ディレクトリにあります。

ポイント 2 の MATLABPATH 環境変数は、通常エンド ユーザーは使用しませんが、ツールボックス/ローカル ディレクトリの外部にあるカスタム classpath.txt を読み取ることを回避策として使用できます。

Windows の場合:

MATLABPATH 環境変数を作成する必要があります。その上の最初のディレクトリは、カスタム classpath.txt を含むディレクトリである必要があり、2 番目のオプションとして toolbox\local ディレクトリも追加する必要があります。したがって、コマンドプロンプトから次のことができます。

set MATLABPATH=c:\Users\user\Documents\myMATLABClasspath;c:\Program Files\MATLAB\R2012b \toolbox\local matlab.exe

于 2013-05-07T19:47:21.350 に答える
2

うまくいくと思われるハックの 1 つは、MATLAB インストール ツールボックス/ローカル フォルダーにある classpath.txt ファイルの先頭に jar を追加することです。残念ながら、これは自動的に生成され、新しいツールボックスをインストールするときなど、不特定の時点で書き換えられる可能性があるため、このアプローチでは、これが発生したときに気づき、ハックを再適用する何らかの方法が必要になります。

于 2013-05-03T19:24:05.610 に答える
1

matlab で使用することを目的とした jar を配布する場合は、 http: //code.google.com/p/guava-libraries/wiki/UsingProGuardWithGuava で説明されているように、proguard を使用することをお勧めします。

すべてのクラスとそれらの (パブリック) フィールドおよびメソッドを保持し、guava を (ライブラリではなく) プログラム jar として含めるように指定すると、guava のすべてのメソッドの名前が変更され、コンパイルされたバイトコードが更新されて新しいものを参照します。名前。

少しハックに思えますが、対象者によっては、ユーザーに静的クラスパスと動的クラスパスについて教えるよりもはるかに簡単であり、古い動作に依存する matlab コードが壊れることはありません。

于 2013-12-30T22:46:53.243 に答える