web-dev-qa-db-ja.com

web.xmlでの環境変数の参照

Web.xml内にあるいくつかのファイルパス設定に依存するJSP Webアプリを事前にパッケージ化しています。これらの設定は、アプリケーション全体(Webアプリが管理インターフェイスである)を展開するときに顧客が設定するパスを参照するため、パッケージ化時には不明です。

インストーラースクリプトでトークンとファイルの変更を回避する最も簡単な方法は、ユーザーにインストール場所を尋ね、この場所を環境変数(Java_HOMEなど)として設定し、web.xmlが常にその変数を参照するようにすることです。

Web.xml内から環境変数値を参照する方法はありますか? Google検索は、ejb xmlファイルから環境変数を設定するJ2EEメソッドにつながります。これは私が探しているものではありません。

33
Udi Bar-On

次のようなTomcat xml構成ファイルのいずれかでAntスタイルの変数置換を使用できます。

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>${foo}</url-pattern>
</servlet-mapping>

fooJavaシステムプロパティ (sysprop)です。

OS環境変数 (envvars)を直接使用することはできません。

Envvarsを使用するには、

set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%"

bin/setenv.bat(または同様にbin/setenv.sh for * nix)。そのファイルを作成する必要がある場合があります。 Tomcatは起動時にこのファイルを実行します。

なので CATALINA_OPTSは(コマンドラインオプションとは対照的に)envvarであり、システム上の他のユーザーに表示されるべきではありません(古代のUnixを保存)。これはテストしていません。

http://Tomcat.Apache.org/Tomcat-7.0-doc/config/

Springを使用している場合は、<context:property-placeholder/> Beanを使用し、Spring XML構成ファイルでenvvarsまたはsyspropsを直接使用します(web.xml)。

36
Neil McGuigan

環境変数(web.xmlからアクセスできないと思う)を使用したくないと思うが、環境entries[ 12 ]。そのようです:

<env-entry>
    <env-entry-name>Bla/SomeFilePath</env-entry-name>
    <env-entry-type>Java.lang.String</env-entry-type>
    <env-entry-value>/opt/bla</env-entry-value>
</env-entry>

次のようにSomeFilePathを使用できます。

InitialContext ic = new InitialContext();
String s = (String) ic.lookup("Java:comp/env/ejb/Bla/SomeFilePath");
11
ax.

基本的に、あなたはそのようにはしません。 web.xmlには事物のデフォルト値が含まれている必要がありますが、実際にはデプロイメントを行うときにそれらをオーバーライドする必要があります。 Tomcatに展開する場合、展開に使用するcontext.xmlに適切なエントリを含めることでこれを行います。例えば:

<Context path="/app">
    <!-- For things described by webapp parameters -->
    <Parameter name="foobar" value="grill" />

    <!-- For things described by environment entries -->
    <Environment name="Bla/SomeFilePath" type="Java.lang.String"
            value="/opt/bla" />
</Context>

他のコンテナには、これを行うための独自のメカニズムがあります。あなたは彼らのドキュメントを調べる必要があります(または、より焦点を絞ったヘルプのリクエストを行ってください)。

8
Donal Fellows

環境変数には、次のようなxmlファイルでアクセスできます。

${env.ENVIRONMENT_VARIABLE_NAME}

明らかに、ユーザーアカウントの設定とアクセスの問題があるかもしれませんが、システム変数を試してみましたが、うまくいきます!

1
E pluribus Unum

Env-entryを順番に並べる必要があります:

<env-entry>
  <env-entry-name>maxAmount</env-entry-name>
  <env-entry-type>Java.lang.String</env-entry-type>
  <env-entry-value>aString</env-entry-value>
</env-entry>

そうでない場合、web.xmlで検証エラーが発生します

参照: https://community.Oracle.com/thread/840452?tstart=

1
Sayeed S. Alam

私はあなたの制限について完全に明確ではありませんが、おそらくあなたはこれを行うことができます(それはあなたが設定しようとしているinit-paramだと仮定しています):

1)web.xmlで変数を未指定のままにします
2)ServletContextListenerを作成し、アプリケーションに追加します
3)サーブレットの初期化をリッスンします
4)その時点でサーブレットのinit-paramを設定します

私は同様の問題でこれを試しましたが、サードパーティのサーブレット(私も混乱させたくない)が実際にはサーブレットとしてまったく動作していないことが判明したため、失敗しました初期化されました。しかし、おそらくここにチャンスがある...

1
Toby Eggitt