【问题标题】:Embedding Jetty 9.3 with modular XmlConfiguration使用模块化 XmlConfiguration 嵌入 Jetty 9.3
【发布时间】: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


    【解决方案1】:

    在加载 Jetty XML 文件时,顺序非常很重要。

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

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

    【讨论】:

    • 有什么方法可以在我的嵌入式应用程序中轻松重用/调用 start.jar 中的函数代码,我可以在其中显示 XML 文件列表,它可以计算出顺序等我?
    • 你不能让 start.jar 只使用 xml 文件。它必须与模块一起使用。
    • 你是嵌入的,在你的嵌入代码中声明xml加载顺序并使用它。无需对此保持动态。
    • 嗯,是的,我们嵌入了 Jetty。但是如果人们可以通过在我们的jetty/etc 文件夹中添加/更改 XML 文件来修改 Jetty 配置,这对我们很有用。我们是否也可以采用 start.jar 中的模块机制?
    • start.jar 使用${jetty.base} 来处理对${jetty.home} 内容的修改需求。 (注意:不要更改/编辑/修改/删除${jetty.home}目录中的内容)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2015-09-10
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多