2016-06-15 36 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加载顺序并使用它。没有必要对它充满活力。 –