2010-10-08 3 views
16

Eseguo webapp su Jetty. La configurazione per l'app proviene da file che vivono sullo stesso server in cui è in esecuzione Jetty. All'interno dell'app faccio affidamento sulla proprietà di sistema per ottenere il percorso del file, così posso analizzarlo. Per esempio.Jetty - set proprietà di sistema

final String loc = System.getProperty(FACTORY); 

Ora posso iniziare molo con l'interruttore D per fornire $FACTORY sulla riga di comando, ma piuttosto metterlo in jetty.xml se posso. So che c'è il tag <SystemProperty /> ma sembra fornire solo il valore di sistema già esistente per il tag <Set/>. Qualcuno può darmi un esempio di come questo possa essere raggiunto? (Se è possibile ottenerlo)

risposta

2

Per configurare un'applicazione Web è preferibile evitare le proprietà di sistema e utilizzare invece JNDI.

Recentemente ho pubblicato uno example su come farlo con Jetty.

+3

Grazie, ma voglio ancora sapere se si può fare e come. Francamente, se impostato da jetty.xml e non nel sistema stesso, non vedo perché è male – Bostone

+2

Il vantaggio è la portabilità. Se mai dovessi distribuire la tua app Web in un altro contenitore, puoi essere certo che esiste un modo per impostare i parametri JNDI. Per quanto ne so il tag 'SystemProperty' nel molo.xml è solo per la lettura di una proprietà di sistema. Ecco il riferimento alla sintassi del Jetty: http://docs.codehaus.org/display/JETTY/Syntax+Reference#SyntaxReference-SystemProperty – vanje

+0

L'unica posizione che conosco per impostare una proprietà di sistema è il file di configurazione per il servizio Jetty di Windows o lo script di shell Unix appropriato. – vanje

3

Accetterò la risposta @vanje poiché mi ha fatto ragionare nella giusta direzione. Ecco quello che ho finito per usare:

  1. Creare molo-web.xml al di fuori della vostra distro WAR (no non si vuole confezionare con guerra, se si desidera configurare l'applicazione da "fuori")
  2. Luogo jetty-web.xml fianco di jetty.xml
  3. avevo bisogno di un solo parametro in modo ho finito con il seguente:

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

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

Il più grande Gotcha per me qui era che stavo cercando di ottenere myString dal ENV defaul che non ha funzionato fino a quando ho capito che stava usando JNDI contesto locale. Questo è OK per me, ma si romperà la portabilità se proverai a spostare WAR su Tomcat. Se qualcuno può pubblicare un esempio di come questo può essere salvato in un contesto predefinito sarebbe OowParam

+0

Questa è una risposta perfetta. L'unica cosa che aggiungerei è che il valore myOwnParam può essere qualsiasi cosa e non è necessario che sia un percorso per un file. (A prima vista ho pensato che dovesse essere un percorso per un file di proprietà.) –

20

Per la cronologia, se è davvero necessario farlo tramite le proprietà di sistema (l'ho fatto) è possibile farlo per aggiungere ad esempio - Drun.mode = messa in scena alle proprietà 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> 

... e sì, si può probabilmente si può programmare l'applicazione attraverso questo ;-)

+0

Grazie per questo. Non voglio cambiare l'argomento della riga di comando, ma ho bisogno di impostare la proprietà file.encoding tramite jetty.xml. –

+0

Un trucco, ma bello, certo. –

+15

aggiungo un po 'versione più compatta: ' run.mode messa in scena ' –

5

Se stai iniziando Jetty attraverso la propria API Java per un test o un'applicazione "incorporata", il seguente esempio mostra in realtà l'impostazione di Java Syste m proprietà prima dell'avvio di 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); 
    } 
} 

differenza della maggior parte di queste risposte, io non ti tenere una conferenza sul fatto che questo è 'corretto' rispetto ad JNDI o qualche altra tecnologia non ha chiesto circa.