【问题标题】:How do I configure embedded jetty to used war file in executable jar as resource如何配置嵌入式码头以使用可执行jar中的war文件作为资源
【发布时间】:2020-10-29 04:20:34
【问题描述】:

我有一个可执行的 jar,里面有一个 war 文件。运行 jar 会提取 war 文件并使用 webAppContext.setWar(warFile) 从中创建一个 WebAppContext。虽然这可行,但似乎webAppContext.setWarResource(warResource) 应该可行。我已经尝试使用 new PathResource("file.war") 创建资源,它显示了类似 "jar:file:/Users/.../jetty-1.0.0-jar-with-dependencies.jar!/file.war 的路径"。听起来很有希望和传统,但是当我尝试它时,我得到 "java.lang.IllegalArgumentException: not file: scheme"。我真的必须提取war文件还是有什么窍门?

【问题讨论】:

    标签: java jetty


    【解决方案1】:

    这将是一个嵌套的 jar 内容引用,没有 Java 程序可以做到这一点。

    选项 1:改用 live-war(又名 executable-war)。

    这将是一个 war 文件,如果您愿意,可以按传统方式部署,但也可以从 java 命令行独立使用(如果需要,它将启动它自己的服务器)。

    Eclipse Jetty 项目维护了一个示例项目,位于... https://github.com/jetty-project/embedded-jetty-live-war

    注意:实战概念的灵感来自 Jenkins 项目及其实战所做的工作。

    选项 2:完全消除 JAR 中的 WAR 文件层

    不要将 JAR 中的 WAR 内容打包为 filename.war,而应考虑将其用作展开的 WAR(或 war 目录)。

    只需将 WAR 解压到您的 JAR 文件中某个安全的地方(例如 /META-INF/webapps/<app-id>/),然后在您的 JAR 文件中引用该目录位置。

    选项 3:完全消除对 WAR 概念的需求

    这是最受欢迎的第一选择。

    您将您的 WAR 文件解构为 ServletContextHandler 并配置了 ServletsFilters,这也消除了对注释扫描/字节码扫描(非常复杂)之类的需求,您也不必wrangle 嵌套/隔离类加载器(您的 uber JAR 文件包含运行 webapp 所需的所有类和下游依赖项),这种方法肯定会加快您的启动时间。

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2014-02-04
      • 1970-01-01
      • 2020-01-03
      • 2010-11-17
      • 1970-01-01
      • 2011-05-08
      相关资源
      最近更新 更多