17

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

final String loc = System.getProperty(FACTORY);

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

4

4 回答 4

23

作为记录,如果您确实需要通过系统属性执行此操作(我做过),您可以执行此操作以将例如-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>

...是的,您可能可以通过它对您的应用程序进行编程;-)

于 2011-01-19T12:36:18.963 回答
7

如果您通过其 Java API 启动 Jetty 用于测试或“嵌入式”应用程序,则以下示例显示在启动 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);
    }
}

与这些答案中的大多数不同,我不会告诉您与 JNDI 或您未询问的其他技术相比这是否“合适”。

于 2014-08-19T18:00:26.057 回答
3

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

  1. 在您的 WAR 发行版之外创建 jetty-web.xml(不,如果您想从“外部”配置应用程序,您不想将其与 WAR 一起打包)
  2. jetty-web.xml旁边的地方jetty.xml
  3. 我只需要一个参数,所以我得到了以下结果:

码头-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();

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

于 2010-10-11T21:04:24.643 回答
2

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

最近我发布了一个关于如何使用 Jetty 来实现的示例。

于 2010-10-09T06:55:31.230 回答