2

特定のディレクトリを Windows システム変数 %PATH% に追加する方法はありますか? これはうまくいかないようです:

String[] cmd = { "cmd", "/c", "set", "PATH=\"%PATH%;c:\\test\"" };
Runtime.getRuntime().exec( cmd );

c:\test\ は System.getenv("PATH"); に表示されません。またはの出力で

String[] cmd = { "cmd", "/c", "echo", "%PATH%" };
Runtime.getRuntime().exec( cmd );

必要なのは、Windows で現在の Java プロセスの %PATH% 変数を変更することです。その理由は、互いに相互参照するいくつかのネイティブ dll ファイルをロードする必要があるためです。そこで、アプリケーション パスを Windows 環境に追加したいと思います。

次に試したのは、次のような C 関数「putenv」用の小さな JNI ラッパーです。

JNIEXPORT void JNICALL Java_com_splitscreen_AppletTest_PutEnv_putEnv
  (JNIEnv *env, jobject jobj, jstring val) {

    jboolean iscopy;

    const char *mvalue = (*env)->GetStringUTFChars(
                env, val, &iscopy);

    putenv(mvalue);
}

これは私がそれを呼び出す方法です:

final String curPath = System.getenv( "PATH" );
final PutEnv pe = new PutEnv();
pe.putEnv( "PATH=" + curPath + ";c:\test" );

final String newPath = System.getenv( "PATH" );
System.out.println( newPath );

しかし、パスは等しいです。Java-System-Environment のマップが更新されていないのか、それとも putenv が機能しなかったのかはわかりません。これを確認する方法はありますか?

4

3 に答える 3

9

これが機能しない理由は、2 つのexec()呼び出しが 2 つの異なるシェルを開始するためです。パスを設定したものは、チェックインしたものではありません。

システム全体の永続的なパス設定を変更することは困難です。ただし、パスが必要な 1 つ以上のプログラムの呼び出し中にパスを変更できます。

具体的には、自分でバッチ ファイル (.CMDまたは.BAT、好きなように) を作成し、先頭近くに を設定し、PATHそのパスで実行したい DOS/Windows コマンドを続けて実行し、次にexec()そのスクリプト ファイルを実行します。


現在のJavaプロセスの PATH を更新することは、かなり無意味に思えます。Java は、一度実行すると、パスを気にしません。または、実行しているライブラリ コードを実行していますか?

を使用して Java から DOS/Windows コマンドを実行している場合はexec()、上記のトリックが機能します。


更新:わかりました。独自の理由で PATH を設定したいライブラリ コードがあり、それが望むものを与えたいと考えています。

ここで検討したいのは、新しい JVM を起動することです。exec(cmd, envp)の環境変数のカスタム セットを使用して、新しい Java アプリケーション (ピンチでは「自分自身」) を起動するためにを使用できますenvp。既に存在するものをコピーして、 の内容を操作するPATHだけです。

新しい Java アプリを起動する標準的な方法は、新しい を作成するClassLoaderことです。その方法については、さまざまな説明があります。しかし、その手順を使用して新しい環境を作成できるかどうかはわかりません。そのためexec、JVM を使用することがより単純であるだけでなく、おそらく唯一の方法である可能性があります。

于 2009-12-22T11:13:35.113 に答える
1

これは、バッチ ファイルを実行するだけでは不可能です。詳細はこちら

システムレベルではなくプロセスレベルの環境変数のみを変更するため、ソリューションは機能しません。

于 2009-12-22T11:14:53.410 に答える
1

JNI 拡張機能を使用している場合は、 -Djava.library.path オプションを介してネイティブ ライブラリが配置されている場所へのパスを渡すことができます。これは、exec ケースでも機能する場合があります。もう 1 つのオプションは、バッチ ファイルから Java アプリを起動し、Java アプリを起動する「前に」コマンド インタープリターで PATH 設定を編集することです。Java アプリはこの PATH 設定を継承します。

NASA WorldWind はネイティブ ライブラリを使用し、アプレットとして実行できます。これをJNLPAppletLauncherで設定する方法は次のとおりです。これが基本的に行うことは、OS を検出し、適切なネイティブ ライブラリをフェッチし、それらをデフォルトの jvm パスの場所に保存して実行することです。Java アプレットから exec を呼び出すことは、あらゆる種類の健全なセキュリティおよびサンドボックス化の原則に違反するため、私は本当に避けたいと思います。

于 2009-12-22T13:43:20.637 に答える