環境変数を取得するのは、
String str = System.getenv("ROOT_DIR");
でできますが、
環境変数に値を設定することができません。
「システム詳細設定」-「環境変数」で設定すればできるのですが、
Javaのプログラム上でいろいろな値に変更しながら、挙動の確認をしたいと思っています。
環境変数を使うのは、システムに依存することになるので、
良くないのはわかっていますが、
Javaで動的に変えたいのです、
Eclipseのデバッグの構成で「環境」から「変数」に「RROT_DIR」を設定すればよいのですが、
動的に変えることができないので、
何かいい方法はありますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
「システム詳細設定」-「環境変数」で設定すればできるのですが、
これと同じ事をやるためには、レジストリの値の変更をすることになります。
アプリケーションのJavaプログラムの中からやるべき事では無いように思います。
mottei6さんのアドバイスのように、「テスト時には実際には環境変数を読まない」というのがいいと思います。
コードの修正をしたくないと言うことだと、バッチファイル経由でプログラムを起動することにして、プログラム起動前にSETすれば出来ますが。
投稿2015/11/14 23:09
総合スコア84559
0
テスト性を向上したいということであれば、System.getenvを直接使用することは止め、ラッパーを経由した設計にしては如何でしょうか?
とあるライブラリ(環境変数を内部で参照)の開発で、JUnitを使用する際に似たような必要性が生じたことがあります。その際は、コード中でSystem.getenvを直接使用するのは止め、自前のラッパーに置換えました。
- ラッパーのメソッドはgetenv, setenv, setDebugMode
- setDebugModeを呼んでいない場合、getenvはSystem.getenvを呼ぶ。setenvは空実装。
- setDebugModeを呼んだ場合、getenvはsetenvされたキーに対応する値を返す。
ラッパー及びスタブを実装/テストする手間は増えますが、テストコード自体の記述は楽になったと記憶しています。
以下2015/11/15 19:45追記
サードベンダ製ライブラリが環境変数を参照する等の事情があるかと拝察します。
そうした場合、環境変数の参照がSystem.getenvによるか、Nativeコードによるかで対処が変わるかと考えます。理由はSystem.getenvが返す値は、ProcessEnvironmentがstatic finalに保持しているunmodifiableMapに格納されており、unmodifiableMapはvm起動時に初期化されているためです。
javaコードから参照する環境変数を変える場合は、前述の通りunmodifiableMapがstatic finalに保持されているため、リフレクションを使っても変更できず、親プロセスの段階でNativeプロセスの環境変数を変えておくしか手がないかと考えます。
Nativeコードから参照する環境変数を変える場合は、JNIやJNAでSetEnvironmentVariable(Win32)やsetenv(posix)を呼ぶことにより変更することができます。JNAで変更する場合のコード例は以下の通りです。
java
1public class MyTest 2 public interface CLibrary extends Library { 3 CLibrary INSTANCE = (CLibrary)Native.loadLibrary("Kernel32.dll", CLibrary.class); 4 boolean SetEnvironmentVariableA(String name, String value); 5 } 6 7 public static void main(String[] args) { 8 try { 9 CLibrary.INSTANCE.SetEnvironmentVariableA("myEnv", "myValue"); 10 } catch (Exception e) { 11 e.printStackTrace(); 12 } 13 } 14}
投稿2015/11/14 15:06
編集2015/11/15 10:47退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
バッチファイルで変更する方法ですることにしました。
[java]
String cmd = "cmd.exe /c start test.bat";
Runtime.getRuntime().exec(cmd);
[bat]
SETX /M ROOT_DIR /var/test
システム管理者の権限がないとダメですが、
とりあえず、これで解決?回避?できました。
投稿2015/11/15 14:18
総合スコア95
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
詳細は確認していませんが、
google で "java set environment variable" を検索して、こんなページを見つけました。
- How do I set environment variables from Java? http://stackoverflow.com/questions/318239/
参考になれば幸いです。
投稿2015/11/14 23:10
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/15 00:08
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/15 00:14
2015/11/15 14:16
2015/11/15 15:29