Ответ 1
Чтобы настроить веб-приложение, лучше избегать системных свойств и использовать JNDI.
Недавно я опубликовал пример о том, как это сделать с Jetty.
Я запускаю webapp на Jetty. Конфигурация приложения происходит из файла, который живет на том же сервере, на котором работает Jetty. Внутри приложения я полагаюсь на свойство system, чтобы получить путь к файлу, чтобы я мог его разобрать. Например.
final String loc = System.getProperty(FACTORY);
Теперь я могу начать причал с D-переключателем, чтобы обеспечить $FACTORY
в командной строке, но я скорее поместил его в jetty.xml, если смогу. Я знаю, что есть тег <SystemProperty />
, но, похоже, просто предоставляет системное значение, которое уже существует для тега <Set/>
. Может ли кто-нибудь дать мне пример, как это может быть достигнуто? (Если это может быть достигнуто)
Чтобы настроить веб-приложение, лучше избегать системных свойств и использовать JNDI.
Недавно я опубликовал пример о том, как это сделать с Jetty.
Для записи, если вам действительно нужно это сделать с помощью свойств системы (я сделал), вы можете сделать это, например, для добавления -Drun.mode = постановки в свойства системы:
<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>
... и да, возможно, вы можете запрограммировать свое приложение через это; -)
Если вы запускаете Jetty через свой Java API для тестирования или "внедренного" приложения, следующий пример показывает фактическую настройку свойств Java System до запуска вашего 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 или какой-либо другой технологией, о которой вы не спрашивали.
Я собираюсь принять ответ @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();
Самым большим для меня здесь было то, что я пытался получить myString
из defaul env, который не работал, пока я не понял, что JNDI использует локальный контекст. Это нормально для меня, но нарушит переносимость, если вы попытаетесь переместить WAR на Tomcat. Если кто-то может опубликовать пример того, как это можно сохранить в контексте по умолчанию, который будет greatOwnParam