使用模块化XmlConfiguration嵌入Jetty 9.3

时间:2016-06-15 00:01:14

标签: jetty embedded-jetty jetty-9

我正在从Jetty 8.1.17迁移到Jetty 9.3.9。我们的应用程序 嵌入 Jetty。以前我们有一个XML配置文件jetty.xml,其中包含我们需要的所有内容。

我觉得使用Jetty 9.3.9,使用他们建议的模块化方法会更好,到目前为止,我有jetty.xmljetty-http.xmljetty-https.xml和{{1在我的jetty-ssl.xml;这些都是9.3.9发行版的副本。当我使用$JETTY_HOME/etc而不是通过我自己的嵌入Jetty的代码时,这似乎很有效。

理想情况下,我希望能够扫描start.jar文件夹中的任何jetty xml文件并加载配置。但是对于嵌入式模式,由于它们之间的$JETTY_HOME/etc依赖性等,我没有明确定义应该加载这些文件的顺序,所以没有找到方法。

我的初步尝试基于How can I programmatically start a jetty server with multiple configuration files?,看起来像是:

<ref id="x"/>

但是,如果在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.xml,或者我将jetty-ssl.xml中的引用放入子配置jetty.xml中的对象,我会在启动时获得例外尚未加载。

在我看来,当你打电话给jetty-blah.xml时,Jetty设法做到这一点没问题,所以我想让Jetty不关心配置文件的解析顺序是什么?

1 个答案:

答案 0 :(得分:0)

加载Jetty XML文件时,订单非常重要

这是整个start.jar及其模块系统的核心所在,拥有一组适当的属性,服务器类路径是正确的,并确保XML的正确加载顺序。

  

注意:它不可能同时加载${jetty.home}/etc中的所有内容,因为您会在常见技术的替代实现上遇到冲突(start.jar也为您管理)