java - 如何配置嵌入式码头以使用可执行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"。我真的必须提取战争文件还是有窍门?
解决方案
那将是一个嵌套的 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
配置的Servlets
and Filters
,这也消除了注释扫描/字节码扫描(这非常复杂)之类的需要,您也不必争论嵌套/隔离类加载器(您的 uber JAR 文件包含运行您的 webapp 所需的所有类和下游依赖项),这种方法肯定会加快您的启动时间。
推荐阅读
- javascript - 不要得到“P”值的输出
- snowflake-cloud-data-platform - 雪花中流的奇怪行为
- flutter - 如何在 Flutter 中从快照中求和不同的字符串
- google-cloud-platform - 如何在 GCP 中使用负载均衡器指向后端端口
- c# - C# RSA 导入公钥
- java - 将字符串列表转换为单个对象
- react-native - 如何解决“react-native-crypto-js”sha256 未定义错误
- python - 无法从节点连接读取描述符:连接到系统的设备无法使用 ChromeDriver Chrome 通过 Selenium 运行错误
- node.js - Dialogflow - setAgent() 错误,无法创建未定义的属性 createStub
- r - 型号比较