2010-10-08 17 views
16

Ejecuto la aplicación web en el embarcadero. La configuración de la aplicación proviene de un archivo que vive en el mismo servidor donde se ejecuta Jetty. Dentro de la aplicación confío en la propiedad del sistema para obtener una ruta al archivo para poder analizarlo. P.ej.Embarcadero: establece la propiedad del sistema

final String loc = System.getProperty(FACTORY); 

Ahora puedo empezar embarcadero con interruptor D para proporcionar $FACTORY en la línea de comandos, pero preferiría ponerlo en jetty.xml si puedo. Sé que existe la etiqueta <SystemProperty />, pero parece que solo proporciona el 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)

Respuesta

2

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

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

+3

Gracias pero todavía quiero saber si se puede hacer y cómo. Francamente, si se establece desde jetty.xml y no en el sistema en sí no veo por qué es malo – Bostone

+2

El beneficio es la portabilidad. Si alguna vez desplegará su aplicación web en otro contenedor, entonces puede estar seguro de que hay una manera de establecer los parámetros JNDI. Por lo que sé la etiqueta 'SystemProperty' en embarcadero.xml es solo para leer una propiedad del sistema. Aquí está la referencia de sintaxis de Jetty: http://docs.codehaus.org/display/JETTY/Syntax+Reference#SyntaxReference-SystemProperty – vanje

+0

La única ubicación que conozco para establecer una propiedad del sistema es el archivo de configuración para el servicio de Windows Jetty o el script de shell Unix apropiado. – vanje

3

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

  1. Crear embarcadero-web.xml fuera de su distribución GUERRA (sin usted no desea empaquetar con la guerra si desea configurar la aplicación de "afuera")
  2. Lugar
  3. jetty-web.xml lado de jetty.xml
  4. que necesitaba sólo un único parámetro, así que terminó con la siguiente:

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

snippets Java

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

El mayor Gotcha para mí aquí era que yo estaba tratando de conseguir myString del env defaul que no funcionaba hasta que me di cuenta de que estaba usando JNDI contexto local. Esto está bien para mí, pero romperá la portabilidad si intentas mover WAR, como Tomcat. Si alguien puede publicar un ejemplo, cómo se puede guardar esto en el contexto predeterminado que sería greatOwnParam

+0

Esta es una respuesta perfecta. Lo único que agregaría es que el valor myOwnParam puede ser cualquier cosa y no es necesario que sea una ruta a un archivo. (A primera vista, pensé que tenía que ser una ruta hacia un archivo de propiedades). –

20

Para el registro, si realmente necesita hacer esto a través de las propiedades del sistema (lo hice) puede hacerlo para anexar, 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í es probable que pueda puede programar su aplicación a través de este ;-)

+0

Gracias por esto. No quiero cambiar el argumento de la línea de comando, pero necesito establecer la propiedad file.encoding a través de jetty.xml. –

+0

Un truco, pero bueno, para estar seguro. –

+15

agrego un poco versión más compacta: ' run.mode puesta en escena ' –

5

Si vas a empezar embarcadero a través de su API Java para una aplicación de prueba o 'incrustada', el siguiente ejemplo muestra realmente la configuración de Java Syste m propiedades 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 voy a dar una conferencia acerca de si esto es 'adecuado' en comparación con JNDI o alguna otra tecnología que no preguntó.

Cuestiones relacionadas