2010-10-08 3 views
16

Я запускаю webapp на Jetty. Конфигурация приложения происходит из файла, который живет на том же сервере, на котором работает Jetty. Внутри приложения я полагаюсь на свойство system, чтобы получить путь к файлу, чтобы я мог его разобрать. Например.Jetty - set system property

final String loc = System.getProperty(FACTORY); 

Теперь я могу начать с причалом D переключатель для обеспечения $FACTORY в командной строке, но я скорее положить его в jetty.xml, если я могу. Я знаю, что есть тег <SystemProperty />, но это похоже на системное значение, которое уже существует для тега <Set/>. Может ли кто-нибудь дать мне пример, как это может быть достигнуто? (Если это может быть достигнуто)

ответ

2

Чтобы настроить веб-приложение, лучше избегать системных свойств и вместо этого использовать JNDI.

Недавно я разместил example о том, как это сделать с Jetty.

+3

Спасибо, но я все еще хочу знать, можно ли это сделать и как. Честно говоря, если он установлен из jetty.xml, а не в самой системе, я не понимаю, почему это плохо. – Bostone

+2

Преимущество переносимости. Если вы когда-либо развертываете свое веб-приложение в другом контейнере, вы можете быть уверены, что есть способ установить JNDI-параметры. Насколько я знаю тег SystemProperty в причале.xml предназначен только для чтения системного свойства. Вот ссылка на синтаксис Jetty: http://docs.codehaus.org/display/JETTY/Syntax+Reference#SyntaxReference-SystemProperty – vanje

+0

Единственное, что я знаю для установки системного свойства, - это либо файл конфигурации для службы Windows Jetty, либо соответствующий сценарий оболочки Unix. – vanje

3

Я собираюсь принять ответ @vanje, так как он заставил меня думать в правильном направлении. Вот что я в конечном итоге с помощью:

  1. Создания пристани-web.xml за пределами вашего WAR дистрибутива (нет, вы не хотите, чтобы упаковать его с 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 из defaul окр, который не работал, пока я не понял, что JNDI использует локальный контекст. Это нормально для меня, но нарушит переносимость, если вы попытаетесь переместить WAR на Tomcat. Если кто-то может опубликовать пример, как это можно сохранить в контексте по умолчанию, который был бы отличнымOwnParam

+0

Это прекрасный ответ. Единственное, что я добавил бы, это то, что значение myOwnParam может быть чем угодно и не обязательно должно быть путем к файлу. (На первый взгляд я думал, что это должен быть путь к файлу свойств.) –

20

Для записи, если вам действительно нужно сделать это через свойства системы (я сделал), вы можете сделать это, например, для добавления - 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> 

... и да, вы можете, вероятно, можно программировать приложения с помощью этого ;-)

+0

Спасибо за это. Я не хочу изменять аргумент командной строки, но мне нужно установить свойство file.encoding через jetty.xml. –

+0

Рука, но хорошая, конечно. –

+15

добавить немного более компактную версию: '<Вызов класса = "java.lang.System" Name = "SetProperty"> run.mode постановка ' –

5

Если вы начинаете Jetty через Java API для тестирующее или «внедренное» приложение, в следующем примере показано, как фактически устанавливается Java Syste m до запуска вашего 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 или какой-либо другой технологии, вы не просили о.