2012-02-27 24 views
8

私は、launch4jを使用してWindowsアプリケーションで実行可能なjarファイルをラップしていますが、JVM引数を使ってそのライブラリのいくつかへの参照を渡す必要があります。問題のライブラリは、アプリケーションインストールディレクトリにあり、常に実行可能ファイルと同じ場所にあります。launch4jを使用しているときに実行可能ファイルへのパスを取得する方法は?

私は、launch4jにJVMオプションで実行可能な相対パスを使用するように伝えたいと思います。私はこの情報がWindowsのバッチスクリプトレベルで利用可能であることを知っていますが、それをフェッチするためにlaunch4jをどのように設定しますか?明確化のため

編集:私は、バイナリ自体へのパスが相対にする方法のために特別に探していない現在の作業ディレクトリにそれらを相対作る方法。 2つは必ずしも同じではありません。

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

は今、あなたはあなたが発生したランチャーでapp.jar開始したい(launch.exeを):私はあなたの質問が正しい理解していれば

+1

Launch4JランチャーからVM引数を使ってjarファイルを呼び出す理由がわかりません。 Launch4Jはそれらを実行可能ファイルに埋め込むことができます。 Launch4J GUIの* Classpath *タブの* Classpath *リストにjarの名前を追加します。 jarがアプリケーションのインストールパスを基準にしたフォルダの下にある場合は、各jarにフォルダパスを接頭辞として付けます。たとえば、 '。/ lib'フォルダにはすべての外部ジャーが含まれ、メインクラスは'。/ 'にあります。クラスパスリストに '。/ lib/myexternal-1.0.jar'と入力してください。 – ecle

+1

これらはjarファイルではないため、ネイティブライブラリです。私がこの方法でロードする必要があるものに関しては、まずSWTブラウザを使用していて、特定のXULRunnerインストール(バンドルされている)をロードします。これを行うには、org.eclipse.swt.browser.XULRunnerPathを設定する必要があります。次に、ロードする必要のある自分のコードで使用されるネイティブDLLがあります。私はそうするためにjava.library.pathを設定したいと思います。 –

+0

'System.getProperties()。list(System.out)'( "user.dir")と 'System.env'を試しましたか? –

答えて

11

あなたは、あなたがより多くを必要とする場合は、通常通りsemikolonによっていくつかのパスを区切るかもしれないあなたのlaunch4j構成に

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

を追加することができます。アサーションのオプション、システムプロパティとX オプション:オプション

< optが>、あなたは通常 のjava/javawをランチャーに渡すすべてを受け入れます。ここでは、EXPLIR (exeの実行時ディレクトリ)、EXEFILE(実行時のフルファイルパス)、 のシステムプロパティに環境変数と特殊変数をマッピングできます。変数参照はすべて、 のパーセント記号で囲まれ、引用符で囲まれている必要があります。

出典:http://launch4j.sourceforge.net/docs.html

1

、あなたのインストールディレクトリ内のlaunch4jの実行可能ファイルとネイティブライブラリを持っています。アプリはlib.dllをロードします。

ファイルをapp.jar(marker.txt)に埋め込むことができます。この文字列が解析できる

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

:今、あなたはクラスローダ

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.Stringを使用することができます)

getResource("marker.txt); 

これは、あなたのような何かを与えるだろう。しかし実際には、私はこの問題のためのより良い解決策があるべきだと思います。

+0

これは現在の作業ディレクトリを取得しますが、実行可能ファイルは必ずしもその場所ではありません。 –

+0

申し訳ありませんが、あなたは正しいです。別のアイデアがあります。 –

+0

うん、賢い。クラスローダーを使ってパスを取得することは考えていませんでした。これはうまくいくかもしれませんが、私はJavaの起動後にシステムプロパティセットを受け入れることができないと少しは心配しています。私は調査しなければならないでしょう。 –

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ランタイムへの効果がある(ない世界的にLinuxではLD_LIBRARY_PATHなど。)

それとも、あなたはJREタブの下Launch4J JVMオプションリストでこれを置くことができます。これが私のプロジェクトでやっていることです。

+0

バイナリを取得する方法 - しかし、相対的なパス? –

+0

私の場合は、怠惰なので、ネイティブライブラリと依存jarを実行可能ファイルと同じフォルダに入れ、 '-Djava.library.path =。\\'を設定します.JVMを同じフォルダにバンドルしてそれに応じて参照します私のLaunch4Jスクリプトファイルで ' jre6' – ecle

+0

バイナリが別のディレクトリから呼び出された場合、これは動作しません。だから私はバイナリ相対パスが必要です。 –

1

あなたは、単にライブラリがLaunch4jでクラスパス]タブに配置されているディレクトリ(たとえば、.. \ libに)を含めることができます。少なくともそれは私のために働いた。

2

configurationのオプションの1つは、実行可能ディレクトリにchdirを許可することです。これは、user.dirをexeと同じディレクトリに置き、他のアプリケーションパスを見つけるために使用できます。

<chdir> 

オプション。現在のディレクトリを実行ファイルに関連する任意のパスに変更します。このプロパティを省略するか空白のままにしても効果はありません。

に設定します。現在のディレクトリを実行可能ファイルと同じディレクトリに変更します。 ..親ディレクトリに変更されます。

<chdir>.</chdir> 
<chdir>../somedir</chdir> 

実行ファイルへの実際のパスを見つけるコードは、OS(readlink、GetModuleFileNameなど)に依存します。

関連する問題