使用模块化 XmlConfiguration 嵌入 Jetty 9.3

Embedding Jetty 9.3 with modular XmlConfiguration

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

我觉得使用 Jetty 9.3.9 使用他们建议的模块化方法会更好,到目前为止我有 jetty.xmljetty-http.xmljetty-https.xmljetty-ssl.xml 在我的 $JETTY_HOME/etc 中;这些几乎是 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.xmljetty-ssl.xml 之前加载,或者如果我在 jetty.xml 中放置对子配置 [=23= 中的对象的引用,我会在启动时出现异常] 尚未首先加载。

在我看来,当您调用 java -jar start.jar 时,Jetty 自己设法做到了这一点,所以我缺少什么让 Jetty 不关心配置文件的解析顺序?

加载 Jetty XML 文件时,顺序极其重要。

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

Note: its not possible to have everything in ${jetty.home}/etc loaded at the same time, as you will get conflicts on alternate implementations of common technologies (something start.jar also manages for you)