首页 > 解决方案 > 如何配置嵌入式码头以使用可执行jar中的war文件作为资源

问题描述

我有一个可执行 jar,里面有一个 war 文件。运行 jar 会提取 war 文件并使用webAppContext.setWar(warFile). 虽然这有效,但似乎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"。我真的必须提取战争文件还是有窍门?

标签: javajetty

解决方案


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

选项 1:改为使用实时战争(又名可执行战争)。

这将是一个 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配置的Servletsand Filters,这也消除了注释扫描/字节码扫描(这非常复杂)之类的需要,您也不必争论嵌套/隔离类加载器(您的 uber JAR 文件包含运行您的 webapp 所需的所有类和下游依赖项),这种方法肯定会加快您的启动时间。


推荐阅读