3

Apache Tomcat 7.0、CentOS 5.8 i386

Web アプリケーションには、そのコンテキストに存在する特定の環境変数XYが必要です。この変数は、計算の結果として/etc/profileに設定され(つまり、静的な値ではありません)、同じシステムで実行されている他のネイティブ アプリケーションでも使用されます (したがって、環境変数のアプローチである必要があります)。

Tomcat は、専用の tomcat ユーザーとsudoを使用して一般的なスクリプトで開始されます。XYsudo経由で渡す際の最初の問題は、/etc/sudoers内で明示的に定義することで (stackoverflow のおかげで) 解決されます。

Defaults    env_keep ="XY"

これは、環境変数XYがsudoによって保持されることを意味しますが、これはデフォルトのケースではありません。

これで、Tomcat プロセスで環境変数XYが表示されます。これは、psおよび/proc/tomcat-PID/environまたは*/your_tomcat/bin/startup.sh* 内の明示的なecho $XY ( sudoを使用して init.d スクリプトによって呼び出される) で確認できます。ただし、Tomcat プロセスでXYを確認しても、Web アプリで確認できるとは限りません。Web アプリは、その環境をログ ファイルにダンプします。

LOGGER.debug("Environment: " + System.getenv());  

私にとって驚くべき結果は、Tomcat にはXY がありましたが、 XYがまったくないということでした。

tomcat 7.0 のコンテキスト ドキュメントを読んだ後 (Tomcat の 7.0 と古いバージョンを区別するように注意してください)、次のエントリを */your_tomcat/conf/context.xml* に追加しました。

<Context>
...
<Environment name="XY" value="INIT_VALUE" type="java.lang.String"/>  
...
</Context>

System.getenv()の出力には実際に私のXY環境変数が含まれていますが、 context.xmlで指定した値 INIT_VALUE ではなく、/ etc /profileからの正しい値が含まれています。言い換えれば、私の/etc/profileはINIT_VALUEを上書きします。これは私が必要としていたものですが、ドキュメントにはこれについての言葉がないため、期待したものではありません。

Tomcat の以降のバージョンで削除される可能性のある文書化されていない動作を見つけましたか、それともこれでよいのでしょうか? したがって、最終的には実用的な解決策が得られたことに満足していますが、これが環境変数を通過するための推奨される適切な方法であるとは確信していません。どんなコメントでも大歓迎です。

4

1 に答える 1

8

Tomcat 環境エントリは、システム環境変数とは異なります。マークアップによって指定された環境エントリ<Environment>は JNDI であり、InitialContext.lookupunderjava:/comp/envを使用してアクセスできますSystem.getEnv()が、 は (Tomcat プロセス自体の) システム環境変数に関するものです。

于 2012-09-25T08:56:24.790 に答える