web-dev-qa-db-ja.com

起動時にTomcat構成でシステムプロパティを指定するにはどうすればよいですか?

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

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

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

73
Markus

(更新:この回答を削除できたとしても、受け入れられているので、できません。説明を更新して、より良いガイダンスを提供し、元の回答で説明した貧弱な慣行の使用を阻止します)。

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>
13
cliff.meyers

cliff.meyersの元の答えは、<env-entry>を使用することを提案しましたが、System.getProperty()のみを使用する場合は役に立ちません。

Tomcat 6.0のドキュメントによると <env-entry>はJNDI用 です。つまり、System.getProperty()には影響しません。

<env-entry> fromcliff.meyersの例では、次のコード

System.getProperty("SMTP_PASSWORD");

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

Tomcat 6のドキュメントによると、<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");

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

28
netjeff

ServletContextListenerにシステムプロパティを設定させることもできます。

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) {
    }
}

そして、これをweb.xmlに入れます(context.xmlでも可能になるはずです)

<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>

それは私のために働いた。

13
basicEntity

通常、webappを構成するためにシステムプロパティに依存するべきではありません-それらはコンテナー(例えばTomcat)を構成するために使用できますが、Tomcat内で実行されるアプリケーションではありません。

cliff.meyersは、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サービスとして実行する場合、通常、Tomcat5w.exe、Tomcat6w.exeなどを使用してサービスのレジストリ設定を構成します。)

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

13
Olaf Kock

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

7
gerrytan

この質問はApache wikiで対処されています。

質問:「Javaシステムプロパティをwebappごとに異なるように設定できますか?」

回答:いいえ。Tomcatの起動スクリプトを編集できる場合(またはsetenv.shファイルを作成した方がよい場合)、Javaに「-D」オプションを追加できます。ただし、Javaには、同じJVMの異なるクラスのシステムプロパティの異なる値を設定する方法はありません。ServletContext.getContextPath()を使用してコンテキスト名を取得するなど、他のメソッドも使用できます。または、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

6
user64141

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

リファレンス: https://Tomcat.Apache.org/Tomcat-8.0-doc/config/index.html

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

2
zendu

コンテキストベースでドキュメントに基づいて環境変数を定義する場合は、次のように定義します。

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

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

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

10出力として。

0
Alireza Alallah