web-dev-qa-db-ja.com

Jetty-システムプロパティを設定します

Jettyでwebappを実行しています。アプリの構成は、Jettyが実行されているのと同じサーバー上にあるファイルから取得されます。アプリ内では、システムプロパティを使用してファイルへのパスを取得し、ファイルを解析できるようにします。例えば。

final String loc = System.getProperty(FACTORY);

これで、Dスイッチを使用してjettyを起動し、コマンドラインで$FACTORYを指定できますが、可能であれば、jetty.xmlに配置します。 <SystemProperty />タグがあることは知っていますが、それは<Set/>タグにすでに存在するシステム値を提供しているようです。誰かがこれをどのように達成できるか例を教えてもらえますか? (達成できる場合)

17
Bostone

Webアプリケーションを構成するには、システムプロパティを避け、代わりにJNDIを使用することをお勧めします。

最近、Jettyでそれを実現する方法について を投稿しました。

2
vanje

ちなみに、システムプロパティを介してこれを行う必要がある場合は(私が行いました)、これを行って、たとえばシステムプロパティに-Drun.mode = stagingを追加できます。

<Call class="Java.lang.System" name="setProperties">
  <Arg>
    <New class="Java.util.Properties">
      <Call name="putAll">
        <Arg><Call class="Java.lang.System" name="getProperties"/></Arg>
      </Call>
      <Call name="setProperty">
        <Arg>run.mode</Arg>
        <Arg>staging</Arg>
      </Call>
    </New>
  </Arg>
</Call>

...そしてそうですあなたはおそらくこれを通してあなたのアプリケーションをプログラムすることができます;-)

22
thoredge

JettyをJava API for test or'embedded 'アプリケーションで起動する場合、次の例は、起動前にJavaシステムプロパティを実際に設定する方法を示しています。 WebAppContextの。

    private void startJetty() {
    try {
        long startTime = System.currentTimeMillis();

        server = new Server();
        setUpSystemProperties(server);

        Connector connector = new SelectChannelConnector();
        connector.setPort(port);
        server.addConnector(connector);

        WebAppContext webAppContext = new WebAppContext();
        webAppContext.setWar("src/main/webapp");
        server.setHandler(webAppContext);

        server.start();
    }
    catch (Exception e) {
        throw new RuntimeException("Failed to set-up web server fixture", e);
    }
}

private void setUpSystemProperties(Server jettyServer) {
    final Properties systemProperties = new Properties();
    // set your system properties...
    systemProperties.setProperty("yourProperty", "yourValue");
    jettyServer.addLifeCycleListener(new SystemPropertiesLifeCycleListener(systemProperties));
}

private class SystemPropertiesLifeCycleListener extends AbstractLifeCycleListener {
    private Properties toSet;

    public SystemPropertiesLifeCycleListener(Properties toSet) {
        this.toSet = toSet;
    }

    @Override
    public void lifeCycleStarting(LifeCycle anyLifeCycle) {
        // add to (don't replace) System.getProperties()
        System.getProperties().putAll(toSet);
    }
}

これらの回答のほとんどとは異なり、これがJNDIまたはあなたが質問しなかった他のテクノロジーと比較して「適切」であるかどうかについては説明しません。

7
Steve Jones

正しい方向に考えさせられたので、@ vanjeの回答を受け入れます。これが私が使用することになったものです:

  1. WARディストリビューションの外部にjetty-web.xmlを作成します(アプリを「外部」から構成する場合は、WARと一緒にパッケージ化する必要はありません)。
  2. 場所 jetty-web.xmlと一緒にjetty.xml
  3. 必要なパラメーターは1つだけだったので、次のようになりました。

jetty-web.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"    
     "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <New class="org.mortbay.jetty.plus.naming.EnvEntry">
        <Arg>myOwnParam</Arg>
        <Arg type="Java.lang.String">//some/path/to/the/file</Arg>
    </New>
</Configure>

Javaスニペット

    InitialContext c = new InitialContext();
    EnvEntry env = (EnvEntry)
         c.lookup("org.mortbay.jetty.plus.naming.EnvEntry/myOwnParam");
    final String myString = (String) env.getObjectToBind();

ここでの最大の落とし穴は、JNDIがローカルコンテキストを使用していることに気付くまで機能しなかったデフォルト環境からmyStringを取得しようとしていたことでした。これは私にとっては問題ありませんが、TomcatなどでWARを移動しようとすると移植性が損なわれます。誰かが例を投稿できれば、これをデフォルトのコンテキストに保存する方法はgreatOwnParamになります

3
Bostone