|
環境変数 またの名を Deprecated からの復活 |
||||||
|
||||||
今回の話は環境変数に関してです。システムプロパティと間違えないでくださいね。 System クラスに getenv メソッドというのがあります。このメソッドは環境変数を取得するためのメソッドなのですが、実質的に使用することができませんでした。 ためしに次のようなコードを J2SE 1.4 でコンパイル、実行してみましょう。
このコードは環境変数 JAVA_HOME を取得して、出力するという単純なものです。
これを J2SDK 1.4.2_04 でコンパイル、実行してみた結果は下のようになりました。
この例から分かるように System#getenv メソッドは Deprecated であると同時に、実際に使ってみても例外が発生してしまって使えないことがわかります。 じゃ、なぜ getenv なんてメソッドがあったかというと、JDK 1.0 までは使えたからなのです!!! そうだとすると、なんで Deprecated になったんでしょう。 答えはセキュリティのためなのです。 アプレットがローカルリソースを扱えないのと同じように、環境変数もローカルのリソースなので扱いを制限していたようです。でも、アプレットならいざ知らず、普通のアプリケーションだったら環境変数を扱ってもいいのになぁとずっと思っていました。 そこで Tiger です。 なんと Tiger では System.getenv の Deprecated がはずされました。JDK 1.0 の頃から Java を使っていますが、Deprecated だったメソッドが Deprecated をはずされたことなんてはじめてです。 これはすごいことですよ ^^;;
|
|
|||||||
さきほどの EnvironmentVariableTest1 クラスを Tiger でコンパイル、実行してみましょう。
確かに正しい値が取得できていました。 Tiger ではすべての環境変数を取得するというメソッドも追加されています。
このサンプルはすべての環境変数を出力するというものです。引数なしの getenv メソッドはキー、値とも String の Map オブジェクトを返すので、それを 1 つ 1 つ出力しています。
実行すると、次のようになります。
|
|
|||||||||||
セキュリティの問題から Deprecated になったぐらいなので、やはりセキュリティは気になります。たとえば、次に示すサンプルを実行してみましょう。
ただ実行するのでは能がないので、セキュリティマネージャを使って Sandbox の中で実行してみます。
ありゃりゃ、例外が発生してしまいました。 Sandbox ではデフォルトで System#getenv メソッドは使えないようになっています。使用するにはポリシーを設定する必要があります。ポリシーは個々の環境変数単位で設定します。 設定は RuntimePermission を使用して行います。ターゲットネームは getenv.[環境変数名] です。 たとえば次に示すポリシーファイルを用意してみました。
ポリシーファイルを指定して実行してみましょう。ポリシーファイル名は java.policy です。
JAVA_HOME は取得できましたが、USERNAME は取得できず例外が発生します。それでは次のようにポリシーファイルを変更してみました。
これで実行すると、正しく値を取得できます。
すべての環境変数を取得するようにするには、ポリシーファイルを次のようにします。
|
|
||||
環境変数が使えることはいいことなのですが、使い方には気をつけなくてはいけません。 たとえばプラットフォームによって大文字と小文字が区別されていなかったり、同じ情報を持つ環境変数の名前が異なったりします。マルチプラットフォームにするならば、こういうところに注意しなくてはならないですね。 それにしても、Deprecated からの復活というのはすごいことです。
今回使用したサンプルはここからダウンロードできます。
(Jun. 2004) |
|