Maven で実行されたプロセスに環境変数を渡す
-
08-10-2019 - |
質問
私はこれについて約1時間壁に頭を打ち続けました。単純なプロパティを渡そうとしています(java.library.path
) を実行して、ec-maven-plugin を実行します。目標は、Netbeans の「ファイルを右クリック」>「ファイルを実行」手順と統合することです。
そこで、POM を次のように設定しました。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<environmentVariables>
<java.library.path>native/win32-x86</java.library.path>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
(実行引数を確認できるように古いバージョンを使用していますが、1.2 では完全に再現可能です)
次に、ファイルを右クリックして「ファイルを実行」をクリックします。NetBeans は次のプロセスを開始します。
W:\programming\apache-maven-2.2.1\bin\mvn.bat -Dexec.classpathScope=runtime -Dexec.args=-classpath %classpath org.quackedcube.camera.CameraDemo -Dexec.executable=C:\Program Files\Java\jdk1.6.0_21\bin\java.exe -Dnetbeans.execution=true -Dmaven.repo.local=W:\programming\maven-repo process-classes exec:exec
(元の完全なクラスパスの実行は次のように変更されました) exec:exec
私の設定が適用されていることを願っています)
しかし、実行されたプログラムは次のようになるため、私の環境変数は明らかに無視されています。
Result of cmd.exe /X /C ""C:\Program Files\Java\jdk1.6.0_21\bin\java.exe" -classpath *snip* org.quackedcube.camera.CameraDemo" execution is: '1'.
私はもう試した
- enviornmentVariable タグ内で個別の Key タグと Value タグを使用する
- enviornmentVariables タグ内でキーと値のタグを直接使用します (試してみる価値があります)
- フェーズへのバインディング
- Maven 引数として渡し、代わりに exec:java を使用します
- プロジェクト構成ページの実行引数および VM オプションとして -Djava.library.path=native/win32-x86 を渡す
そしてすべて失敗しました。ここで本当に迷っています。
これが Maven で JNI を使用することの欠点だと思います。テスト、ランタイム、モジュール実行 POM、および親 POM に引数として渡す必要があります。
そこで私の質問:どうすれば合格できますか java.library.path
実行ファイルのプロパティ?Netbeans の Run File 機能と統合されていれば素晴らしいでしょう (そのため、POM でクラス名を変更し、ビルドして実行する必要がありません)
解決
これは知りませんでしたが、どうやらこれを行うときはこのプロパティを最初に置く必要があるようです。クラスパスはすぐには実行されないため、必要ないと思っていましたが、どうやら違いがあるようです。
これを修正するには、[プロジェクトのプロパティ] > [アクション] > [メイン経由でファイルを実行] でこれを変更するだけです。
exec.classpathScope=${classPathScope}
exec.args=-Djava.library.path="native/win32-x86" -classpath %classpath ${packageClassName}
exec.executable=java
POM で指定できない理由は、NB がクラスパスとその実行内容をコマンドライン経由で渡すためです。 exec.args
, 、これは POM の内容をオーバーライドします。
これは醜く、プラットフォームに依存するかもしれませんが、JNI と Maven を混合すると何が起こります。私が見ることができる他の方法は実際にはありません。
他のヒント
これを試したかどうかはわかりませんが、JVM のレベルでプロパティを設定する必要がある限り、次のように行う必要があります。 -Djava.library.path=/some/path
したがって、exec-maven-plugin にそれを指定するには、次のように書くことができます。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Djava.library.path=${java.library.path}</argument>
</arguments>
</configuration>
</plugin>
もちろん、実行可能ファイルを更新し、場合によっては別の属性を追加する必要があります。