我在Jetty上运行webapp。应用程序的配置来自运行Jetty的同一服务器上的文件。在应用程序内部,我依靠系统属性来获取文件的路径,以便我可以解析它。 E.g。
final String loc = System.getProperty(FACTORY);
现在我可以使用D开关启动jetty以在命令行上提供$FACTORY
但是如果可以的话我宁愿把它放在jetty.xml中。我知道有<SystemProperty />
标记,但似乎只提供<Set/>
标记已存在的系统值。有人可以举例说明如何实现这一目标吗? (如果可以实现)
答案 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的回答,因为它让我思考正确的方向。这是我最终使用的内容:
jetty-web.xml
放在jetty.xml
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实现这一目标。