我正在从Jetty 8.1.17迁移到Jetty 9.3.9。我们的应用嵌入码头。以前我们有一个XML配置文件jetty.xml
,它包含了我们需要的所有东西。使用模块化XmlConfiguration嵌入Jetty 9.3
我认为,随着码头9.3.9它会好得多使用模块化的方式,他们建议,到目前为止,我jetty.xml
,jetty-http.xml
,jetty-https.xml
和jetty-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.xml
被jetty-ssl.xml
之前加载或如果我置于jetty.xml
参考从还没有被第一加载的子配置jetty-blah.xml
的一个对象。
在我看来,当Jetty设法自己调用java -jar start.jar
时,它自己可以做到这一点,所以我错过了什么让Jetty不关心配置文件被解析的顺序?
冲突有什么办法我可以在我的嵌入式应用程序中轻松地重新使用/调用start.jar中的函数代码,在那里我可以用XML文件列表来呈现它,并且它可以找出我的订单等? – adamretter
你不能只有xml文件的start.jar。它必须使用模块。 –
您已嵌入,请在嵌入式代码中声明xml加载顺序并使用它。没有必要对它充满活力。 –