configuration jetty system-properties

configuration - Embarcadero-Establecer propiedad del sistema



jetty system-properties (4)

Para configurar una aplicación web es mejor evitar las propiedades del sistema y usar JNDI en su lugar.

Recientemente publiqué un example sobre cómo lograr eso con Jetty.

Esta pregunta ya tiene una respuesta aquí:

Ejecuto webapp en Jetty. La configuración de la aplicación proviene de un archivo que se encuentra en el mismo servidor donde se está ejecutando Jetty. Dentro de la aplicación confío en la propiedad del sistema para obtener una ruta al archivo para poder analizarlo. P.ej

final String loc = System.getProperty(FACTORY);

Ahora puedo iniciar Jetty con el interruptor D para proporcionar $FACTORY en la línea de comandos, pero prefiero ponerlo en jetty.xml si puedo. Sé que hay una etiqueta <SystemProperty /> pero parece que solo proporciona un valor del sistema que ya existe para la etiqueta <Set/> . ¿Puede alguien darme un ejemplo de cómo se puede lograr esto? (Si se puede lograr)


Para el registro, si realmente necesita hacer esto a través de las propiedades del sistema (lo hice), puede hacer esto para agregar, por ejemplo, -Drun.mode = puesta en escena a las propiedades del sistema:

<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>

... y sí, probablemente puedas programar tu aplicación a través de esto ;-)


Si está iniciando Jetty a través de su API de Java para una aplicación de prueba o "incrustada", el siguiente ejemplo muestra cómo se configuran las propiedades del sistema Java antes del inicio de su 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); } }

A diferencia de la mayoría de estas respuestas, no te daré una conferencia sobre si esto es "correcto" en comparación con JNDI o alguna otra tecnología que no hayas preguntado.


Voy a aceptar la respuesta de @vanje ya que me hizo pensar en la dirección correcta. Esto es lo que terminé usando:

  1. Cree jetty-web.xml fuera de su distribución WAR (no, no desea empaquetarlo con WAR si desea configurar la aplicación desde "afuera")
  2. Coloque jetty-web.xml lado de jetty.xml
  3. Necesitaba un solo parámetro, así que terminé con lo siguiente:

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>

Fragmento de Java

InitialContext c = new InitialContext(); EnvEntry env = (EnvEntry) c.lookup("org.mortbay.jetty.plus.naming.EnvEntry/myOwnParam"); final String myString = (String) env.getObjectToBind();

Lo más importante para mí aquí fue que estaba tratando de obtener myString de la env del valor predeterminado que no funcionó hasta que me di cuenta de que JNDI estaba usando el contexto local. Esto está bien para mí pero romperá la portabilidad si intenta mover WAR en, por ejemplo, Tomcat. Si alguien puede publicar un ejemplo de cómo se puede guardar en el contexto predeterminado, sería greatOwnParam