9

Windows アプリケーションで実行可能な jar ファイルをラップするために launch4j を使用していますが、JVM 引数を介してそのライブラリの一部への参照を渡す必要があります。問題のライブラリは、アプリケーションのインストール ディレクトリに存在し、実行可能ファイルに対して常に同じ場所にあります。

JVM オプションで実行可能な相対パスを使用するように launch4j に指示したいと思います。この情報が Windows バッチ スクリプト レベルで利用できることは知っていますが、launch4j をどのように設定して取得するのでしょうか?

明確にするために編集:パスを現在の作業ディレクトリに対して相対的にする方法ではなく、バイナリ自体に対して相対的にパスを作成する方法を特に探しています。両者は必ずしも同じではありません。

4

5 に答える 5

12

あなたのlaunch4j構成に追加するかもしれません

...
<jre>
...
<opt>-Djna.library.path="%EXEDIR%\\path\\to\\lib"</opt>
<opt>-Djava.library.path="%EXEDIR%\\path\\to\\lib"</opt>
...
</jre>
...

それ以上必要な場合は、通常どおりセミコロンで複数のパスを区切ることができます。

< opt> オプション。アサーション オプション、システム プロパティ、および X オプションなど、通常 java/javaw ランチャーに渡すすべてのものを受け入れます。ここでは、環境変数と特殊変数 EXEDIR (exe のランタイム ディレクトリ)、EXEFILE (exe のランタイムのフル ファイル パス) をシステム プロパティにマップできます。すべての変数参照は、パーセント記号で囲み、引用符で囲む必要があります。

ソース: http://launch4j.sourceforge.net/docs.html

于 2012-03-01T15:55:54.740 に答える
3

-Djna.library.path=<relative path of native libraries>(JNA を使用している場合) と を設定し-Djava.library.path=<relative path of native libraries>ます。

あるいは、これは Java コードで次のように行うこともできます:System.setProperty("jna.library.path","<relative path of native libraries>")およびSystem.setProperty("java.library.path","<relative path of native libraries>"). 参照するパスはいくつでも追加できます。Windows では;、パスを区切るために使用します。

このセットアップは、その Java アプリケーションの JVM ランタイムにのみ影響します ( LD_LIBRARY_PATH Linux のようにグローバルには影響しません)。

または、これを [ JRE ] タブの Launch4J JVM オプションリストに入れることもできます。これが私のプロジェクトで行うことです。

于 2012-03-01T11:38:14.893 に答える
1

Launch4j のクラスパス タブに、ライブラリが配置されているディレクトリ (..\lib など) を含めるだけです。少なくともそれは私にとってはうまくいきました。

于 2012-03-05T11:55:53.027 に答える
1

あなたの質問が正しいと理解できれば、インストール ディレクトリ内に launch4j 実行可能ファイルとネイティブ ライブラリがあります。

/launch.exe
/bin/lib.dll
/lib/app.jar

次に、生成されたランチャー (launch.exe) を使用して app.jar を起動します。アプリは lib.dll をロードします。

app.jar (marker.txt) にファイルを埋め込むことができます。ClassLoader を使用できるようになりました

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String )

getResource("marker.txt);

これにより、次のような結果が得られます。

file://c://installdir/lib/app.jar!marker.txt

この文字列は解析できます。しかし、実際には、この問題にはもっと良い解決策があるはずだと思います。

于 2012-02-29T20:57:22.487 に答える