76

「 -Dmy.prop=value 」のように、-D パラメータを使用して引数を渡すことで、Tomcat にシステム プロパティを指定できることを理解しています。

context.xml ファイルまたはその他の tomcat 構成ファイルでプロパティ値を指定することにより、これを行うよりクリーンな方法があるかどうか疑問に思っています。1 つ目は、プロパティを追跡する方が簡単であること、2 つ目は、複数のコンテキストを実行していて、-D パラメータを使用してコンテキスト固有のプロパティを指定する方法がわからないことです。

Tomcat バージョン 5.5 を使用しています。

4

8 に答える 8

29

<env-entry>System.getProperty() のみを使用する場合は、使用しても役に立たないことを示唆したクリフ.マイヤーズの元の回答

Tomcat 6.0 docs によると、<env-entry>JNDI 用です。つまり、 には何の影響もありませんSystem.getProperty()

クリフ.マイヤーズ<env-entry>からの例では、次のコード

System.getProperty("SMTP_PASSWORD");

値「abc123ftw」ではなく、null を返します。

Tomcat 6 docs によると、使用するには、次の<env-entry>ようなコードを記述して使用する必要があり<env-entry>ます。

// Obtain our environment naming context
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");

// Look up our data source
String s = (String)envCtx.lookup("SMTP_PASSWORD");

警告: 上記の例を実際に試したことはありません。しかし、私System.getProperty() を試してみ<env-entry>ましたが、それは間違いなく機能しません。

于 2009-01-26T23:01:09.163 に答える
14

(更新:この回答を削除できれば、受け入れられたので削除できません。説明を更新して、より良いガイダンスを提供し、元の回答で概説した不適切な方法を使用しないようにします)。

これらのパラメーターは、context.xmlなどのコンテキストまたは環境パラメーターを介して指定できます。このページの「コンテキストパラメータ」および「環境エントリ」というタイトルのセクションを参照してください。

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

@netjeffが指摘しているように、これらの値は、システムパラメータとしてではなく、Context.lookup(String)メソッドを介して利用できます。

これらの値を指定する別の方法は、デプロイするWebアプリケーションのweb.xmlファイル内に変数を定義することです(以下を参照)。@Roberto Lo Giaccoが指摘しているように、デプロイされたアーティファクトは環境固有であってはならないため、これは一般的に不適切な方法と見なされます。ただし、本当にこれを実行したい場合は、以下に構成スニペットを示します。

<env-entry>
    <env-entry-name>SMTP_PASSWORD</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>abc123ftw</env-entry-value>
</env-entry>
于 2008-12-18T03:22:56.767 に答える
13

It's also possible letting a ServletContextListener set the System properties:

import java.util.Enumeration;
import javax.servlet.*;

public class SystemPropertiesHelper implements
        javax.servlet.ServletContextListener {
    private ServletContext context = null;

    public void contextInitialized(ServletContextEvent event) {
        context = event.getServletContext();
        Enumeration<String> params = context.getInitParameterNames();

        while (params.hasMoreElements()) {
          String param = (String) params.nextElement();
          String value = 
            context.getInitParameter(param);
          if (param.startsWith("customPrefix.")) {
              System.setProperty(param, value);
          }
        }
    }

    public void contextDestroyed(ServletContextEvent event) {
    }
}

And then put this into your web.xml (should be possible for context.xml too)

<context-param>
        <param-name>customPrefix.property</param-name>
        <param-value>value</param-value>
        <param-type>java.lang.String</param-type>
</context-param>

<listener>
    <listener-class>servletUtils.SystemPropertiesHelper</listener-class>    
</listener>

It worked for me.

于 2010-02-25T15:49:48.837 に答える
13

一般に、システム プロパティに依存して Web アプリケーションを構成するべきではありません。システム プロパティは、コンテナー (Tomcat など) の構成には使用できますが、Tomcat 内で実行されるアプリケーションには使用できません。

クリフ.マイヤーズは、Webアプリケーションに使用する方法についてすでに言及しています。これは標準的な方法であり、context.xml または server.xml を介して構成可能であるという質問にも適合します。

そうは言っても、Tomcat でシステム プロパティまたはその他の jvm オプション (最大メモリ設定など) が本当に必要な場合は、「bin/setenv.sh」または「bin/setenv.bat」という名前のファイルを作成する必要があります。これらのファイルは、ダウンロードした標準アーカイブには存在しませんが、存在する場合、コンテンツは起動時に実行されます (startup.sh/startup.bat を介して tomcat を起動した場合)。これは、独自の設定を標準の tomcat 設定から分離する良い方法であり、更新が非常に簡単になります。startup.sh や catalina.sh を微調整する必要はありません。

(Tomcat を Windows Servive として実行する場合、通常は tomcat5w.exe、tomcat6w.exe などを使用してサービスのレジストリ設定を構成します。)

編集:また、別の可能性はJNDI Resourcesに行くことです。

于 2008-12-28T14:49:59.147 に答える
8

Tomcat 構成でシステム プロパティを設定する代わりに、CATALINA_OPTS 環境変数を使用することもできます。

于 2012-09-25T23:27:20.043 に答える
6

この質問は Apache wiki で解決されています。

質問: 「Web アプリケーションごとに異なる Java システム プロパティを設定できますか?」

回答: いいえ。Tomcat の起動スクリプトを編集できる (または setenv.sh ファイルを作成する) ことができる場合は、Java に「-D」オプションを追加できます。しかし、Java では、同じ JVM 内の異なるクラスに対して異なる値のシステム プロパティを設定する方法はありません。ServletContext.getContextPath() を使用して Web アプリケーションのコンテキスト名を取得し、それに応じていくつかのリソースを見つけたり、Web アプリケーションの WEB-INF/web.xml ファイルで要素を定義してからそれらの値は、Tomcat コンテキスト ファイル (META-INF/context.xml) にあります。http://tomcat.apache.org/tomcat-7.0-doc/config/context.htmlを参照してください。

http://wiki.apache.org/tomcat/HowTo#Can_I_set_Java_system_properties_differently_for_each_webapp.3F

于 2015-07-20T16:49:23.250 に答える
4

catalina.propertiesディレクトリ内のファイルに必要なプロパティを追加できます<tomcat installation directory>/conf

参照: https://tomcat.apache.org/tomcat-8.0-doc/config/index.html

-D 構文を使用して設定されたもの、JVM によって自動的に使用可能になったもの、および $CATALINA_BASE/conf/catalina.properties ファイルで構成されたものを含む、すべてのシステム プロパティを使用できます。

于 2017-11-09T21:13:25.423 に答える
0

ドキュメントに基づいてコンテキストで環境変数を定義する場合は、以下のように定義する必要があります

<Context ...>
  ...
  <Environment name="maxExemptions" value="10"
         type="java.lang.Integer" override="false"/>
  ...
</Context>

また、以下のように使用します。

((Context)new InitialContext().lookup("java:comp/env")).lookup("maxExemptions")

出力として取得する必要があり10ます。

于 2018-04-24T08:21:53.553 に答える