2016-06-15 4 views
0

Ich migriere von Jetty 8.1.17 nach Jetty 9.3.9. Unsere Anwendung bettet Anlegesteg. Zuvor hatten wir eine einzige XML-Konfigurationsdatei jetty.xml, die alles enthielt, was wir brauchten.Embedding Jetty 9.3 mit modularer XmlConfiguration

Ich fühlte, dass mit Jetty 9.3.9 wäre es viel schöner sein, den modularen Ansatz zu verwenden, die sie vorschlagen, so weit ich habe jetty.xml, jetty-http.xml, jetty-https.xml und jetty-ssl.xml in meinem $JETTY_HOME/etc; Das sind Kopien der 9.3.9 Distribution. Dies scheint gut zu funktionieren, wenn ich start.jar benutze, aber nicht durch meinen eigenen Code, der Jetty einbettet.

Idealerweise würde ich gerne in der Lage sein, nach Jetty XML-Dateien im $JETTY_HOME/etc Ordner zu suchen und die Konfiguration zu laden. Doch für Embedded-Modus habe ich keine Möglichkeit, das zu tun, ohne explizit die Definition der Reihenfolge, dass diese Dateien sollten geladen sein, aufgrund <ref id="x"/> Abhängigkeiten zwischen ihnen usw. gefunden

Mein erster Versuch basiert auf How can I programmatically start a jetty server with multiple configuration files? und sieht aus wie:

final List<Object> configuredObjects = new ArrayList(); 
XmlConfiguration last = null; 
for(final Path confFile : configFiles) { 
    logger.info("[loading jetty configuration : {}]", confFile.toString()); 
    try(final InputStream is = Files.newInputStream(confFile)) { 
     final XmlConfiguration configuration = new XmlConfiguration(is); 
     if (last != null) { 
      configuration.getIdMap().putAll(last.getIdMap()); 
     } 
     configuredObjects.add(configuration.configure()); 
     last = configuration; 
    } 
} 

Server server = null; 
// For all objects created by XmlConfigurations, start them if they are lifecycles. 
for (final Object configuredObject : configuredObjects) { 
    if(configuredObject instanceof Server) { 
     server = (Server)configuredObject; 
    } 

    if (configuredObject instanceof LifeCycle) { 
     final LifeCycle lc = (LifeCycle)configuredObject; 
     if (!lc.isRunning()) { 
      lc.start(); 
     } 
    } 
} 

Allerdings bekomme ich Ausnahmen beim Start, wenn jetty-https.xml vor jetty-ssl.xml geladen wird oder wenn ich lege einen Verweis in jetty.xml auf ein Objekt aus einer Unter Konfiguration jetty-blah.xml der ersten nicht geladen wurde.

Es scheint mir, Jetty schafft es, dies in Ordnung zu tun, wenn Sie java -jar start.jar aufrufen, also was fehlt mir, um Jetty zu interessieren, in welcher Reihenfolge die Konfigurationsdateien analysiert werden?

Antwort

0

Bestellung ist extrem wichtig beim Laden der Jetty XML-Dateien.

Das ist das Herz von dem, was das gesamte start.jar und sein Modulsystem ist, haben eine geeignete Reihe von Eigenschaften, der Server Classpath ist gesund, und die ordnungsgemäße Lade Reihenfolge der XML zu gewährleisten.

Hinweis: es ist nicht möglich, alles in ${jetty.home}/etc zugleich geladen zu haben, wie Sie Konflikte auf alternative Implementierungen von gängigen Technologien erhalten werden (etwas start.jar verwaltet auch für Sie)

+0

Gibt es eine Möglichkeit dass ich Funktionscode von start.jar in meiner eingebetteten APP leicht wiederverwenden/benennen kann, wo ich es mit einer Liste von XML-Dateien darstellen kann und es die Ordnung usw. für mich herausfinden kann? – adamretter

+0

Sie können start.jar nicht mit nur XML-Dateien arbeiten. es muss mit Modulen arbeiten. –

+0

Sie sind eingebettet, deklarieren Sie die XML-Ladereihenfolge in Ihrem eingebetteten Code und verwenden Sie sie. Es muss nicht dynamisch sein. –