2016-06-15 71 views
0

我正在從Jetty 8.1.17遷移到Jetty 9.3.9。我們的應用嵌入碼頭。以前我們有一個XML配置文件jetty.xml,它包含了我們需要的所有東西。使用模塊化XmlConfiguration嵌入Jetty 9.3

我認爲,隨着碼頭9.3.9它會好得多使用模塊化的方式,他們建議,到目前爲止,我jetty.xmljetty-http.xmljetty-https.xmljetty-ssl.xml在我$JETTY_HOME/etc;這幾乎是9.3.9發行版的副本。當我使用start.jar而不是通過我自己的嵌入Jetty的代碼時,這看起來很好。

理想情況下,我希望能夠掃描$JETTY_HOME/etc文件夾中的任何jetty xml文件並加載配置。然而,對於嵌入模式我還沒有找到一種方法來做到這一點無需顯式定義,這些文件應該被加載時,由於它們之間等<ref id="x"/>依賴順序

我最初的嘗試是基於How can I programmatically start a jetty server with multiple configuration files?,看起來像:

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(); 
     } 
    } 
} 

然而,我在啓動時得到異常如果jetty-https.xmljetty-ssl.xml之前加載或如果我置於jetty.xml參考從還沒有被第一加載的子配置jetty-blah.xml的一個對象。

在我看來,當Jetty設法自己調用java -jar start.jar時,它自己可以做到這一點,所以我錯過了什麼讓Jetty不關心配置文件被解析的順序?

回答

0

訂購是極其重要加載Jetty XML文件時很重要。

這是整個start.jar及其模塊系統的核心,具有適當的一組屬性,服務器類路徑十分健全,並確保XML的正確加載順序。

注意:它不可能擁有一切在同一時間加載${jetty.home}/etc,因爲你會得到共性技術的可選的實施方式(東西start.jar還爲您管理)

+0

衝突有什麼辦法我可以在我的嵌入式應用程序中輕鬆地重新使用/調用start.jar中的函數代碼,在那裏我可以用XML文件列表來呈現它,並且它可以找出我的訂單等? – adamretter

+0

你不能只有xml文件的start.jar。它必須使用模塊。 –

+0

您已嵌入,請在嵌入式代碼中聲明xml加載順序並使用它。沒有必要對它充滿活力。 –