質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

5回答

22348閲覧

環境変数をjavaで設定する方法を教えて下さい

toroleaman

総合スコア95

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2015/11/14 13:53

環境変数を取得するのは、
String str = System.getenv("ROOT_DIR");
でできますが、

環境変数に値を設定することができません。

「システム詳細設定」-「環境変数」で設定すればできるのですが、
Javaのプログラム上でいろいろな値に変更しながら、挙動の確認をしたいと思っています。
環境変数を使うのは、システムに依存することになるので、
良くないのはわかっていますが、
Javaで動的に変えたいのです、
Eclipseのデバッグの構成で「環境」から「変数」に「RROT_DIR」を設定すればよいのですが、
動的に変えることができないので、
何かいい方法はありますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

「システム詳細設定」-「環境変数」で設定すればできるのですが、

これと同じ事をやるためには、レジストリの値の変更をすることになります。
アプリケーションのJavaプログラムの中からやるべき事では無いように思います。

mottei6さんのアドバイスのように、「テスト時には実際には環境変数を読まない」というのがいいと思います。
コードの修正をしたくないと言うことだと、バッチファイル経由でプログラムを起動することにして、プログラム起動前にSETすれば出来ますが。

投稿2015/11/14 23:09

otn

総合スコア84559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toroleaman

2015/11/15 00:14

レジストリを変えてやる方法、バッチファイル経由の方法を検討してみます。
toroleaman

2015/11/15 14:16

バッチファイルで変更する方法ですることにしました。 [java] String cmd = "cmd.exe /c start test.bat"; Runtime.getRuntime().exec(cmd); [bat] SETX /M ROOT_DIR /var/test システム管理者の権限がないとダメですが、 とりあえず、これで解決?回避?できました。
otn

2015/11/15 15:29

SETXじゃなくて、SET ROOT_DIR=/var/test じゃ駄目ですか?
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toroleaman

2015/11/15 00:13

回答ありがとうございます。おっしゃる通りgetenvを使用するべきではないと思います。 getPropertiesを使うのが良いとは思います。 今回は、このべストな手法は、取り入れることができない事情があるので、 今後は、この方法を取るようにします。
guest

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

toroleaman

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

環境変数ではなくJavaプロパティを使うという方向にはできませんか?
そうすると、設定する環境変数は"ROOT_DIR"ではなく”−DROOT_DIR"になります。
プロパティだったらEclipseからもコード内でも設定可能です。

投稿2015/11/15 00:20

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

詳細は確認していませんが、
google で "java set environment variable" を検索して、こんなページを見つけました。

参考になれば幸いです。

投稿2015/11/14 23:10

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toroleaman

2015/11/15 00:08

回答ありがとうございます。 実行するプロセスの環境変数を一時的に設定することは、以下のように可能のようですね。動作している環境の環境変数を変えることは、できないようです。 ProcessBuilder builder = new ProcessBuilder("実行するプロセス", "プロセスに渡す引数"); Map<String, String> env = builder.environment(); env.put("ROOT_DIR", "/var/temp"); 何かできそうなのですが、あと少し。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問