【发布时间】:2016-10-15 21:32:09
【问题描述】:
我正在从 Jetty 8.1.17 迁移到 Jetty 9.3.9。我们的应用程序嵌入 Jetty。以前我们只有一个 XML 配置文件 jetty.xml,其中包含我们需要的一切。
我觉得使用 Jetty 9.3.9 使用他们建议的模块化方法会更好,到目前为止,我的 $JETTY_HOME/etc 中有 jetty.xml、jetty-http.xml、jetty-https.xml 和 jetty-ssl.xml;这些几乎是 9.3.9 发行版中的副本。当我使用 start.jar 但不是通过我自己的嵌入 Jetty 的代码时,这似乎工作得很好。
理想情况下,我希望能够扫描$JETTY_HOME/etc 文件夹中的任何码头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.xml 在 jetty-ssl.xml 之前加载,或者如果我在 jetty.xml 中对来自子配置 jetty-blah.xml 的对象的引用(该对象尚未首先加载),我会在启动时遇到异常。
在我看来,当您调用 java -jar start.jar 时,Jetty 自己可以做到这一点,所以我错过了什么让 Jetty 不关心配置文件的解析顺序?
【问题讨论】:
标签: jetty embedded-jetty jetty-9