Подтвердить что ты не робот

Свойства системы Jetty - set

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

final String loc = System.getProperty(FACTORY);

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Если вы запускаете 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 или какой-либо другой технологией, о которой вы не спрашивали.

Ответ 4

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

  • Создайте jetty-web.xml вне вашего WAR-дистрибутива (нет, вы не хотите упаковывать его с помощью WAR, если вы хотите настроить приложение "снаружи" ).
  • Поместите 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