Jetty - 设置系统属性

时间:2010-10-08 23:52:49

标签: configuration jetty system-properties

我在Jetty上运行webapp。应用程序的配置来自运行Jetty的同一服务器上的文件。在应用程序内部,我依靠系统属性来获取文件的路径,以便我可以解析它。 E.g。

final String loc = System.getProperty(FACTORY);

现在我可以使用D开关启动jetty以在命令行上提供$FACTORY但是如果可以的话我宁愿把它放在jetty.xml中。我知道有<SystemProperty />标记,但似乎只提供<Set/>标记已存在的系统值。有人可以举例说明如何实现这一目标吗? (如果可以实现)

4 个答案:

答案 0 :(得分:22)

对于记录,如果你真的需要通过系统属性(我这样做),你可以这样做,例如 -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>

...是的,您可以通过此方式编写应用程序; - )

答案 1 :(得分:7)

如果你通过Java API启动Jetty进行测试或者嵌入式游戏&#39;在以下示例中,示例显示了在启动WebAppContext之前实际设置Java System属性。

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

与大多数这些答案不同,我不会告诉你这是否适当&#39;与JNDI或您没有提出的其他技术相比。

答案 2 :(得分:3)

我会接受@vanje的回答,因为它让我思考正确的方向。这是我最终使用的内容:

  1. 在WAR发行版之外创建jetty-web.xml(如果你想从“外部”配置应用程序,不要不想用WAR打包它)
  2. jetty-web.xml放在jetty.xml
  3. 旁边
  4. 我只需要一个参数,所以我最终得到了以下内容:
  5. 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();
    

    对我来说,最大的问题是我试图从默认的env中获取myString,直到我意识到JNDI正在使用本地环境之后才能工作。这对我来说没问题,但是如果你尝试在Tomcat上移动WAR会破坏可移植性。如果有人可以发布一个示例,如何将其保存到默认上下文中,这将是greatOwnParam

答案 3 :(得分:2)

要配置Web应用程序,最好避免使用系统属性并改为使用JNDI。

最近我发布了example关于如何使用Jetty实现这一目标。