是否存在非取巧方式从胖JAR运行Jakarta Server Faces应用?
从JAR运行JSF+EJB应用的现代方案
1. 用Jakarta EE 9+的可执行Uber-JAR模式
现在Jakarta EE(原JEE)已经支持把整个应用连服务器运行时一起打包成可执行Uber-JAR,直接通过java -jar就能启动,所有资源都从类路径加载,完全匹配你想要的“把服务器当库用”的思路。
以Payara Micro为例:
- 借助Maven的
payara-micro-maven-plugin插件,配置uberJar构建目标,插件会自动把Payara Micro运行时和你的应用打包成单个JAR,所有类、页面、配置等资源都嵌入其中,运行时直接从类路径读取,完全不需要磁盘上的WAR文件。 - 给你一个Maven配置片段参考:
<plugin> <groupId>fish.payara.maven.plugins</groupId> <artifactId>payara-micro-maven-plugin</artifactId> <version>5.2022.5</version> <executions> <execution> <goals> <goal>uberJar</goal> </goals> </execution> </executions> </plugin> - 构建完成后直接运行
java -jar target/你的应用名-uber.jar即可,不需要单独安装服务器。
2. WildFly Bootable JAR
WildFly的Bootable JAR灵活性更高,能只打包你需要的功能模块(比如仅保留JSF和EJB),生成的JAR体积更轻量化。它同样是把服务器和应用打包成单个可执行JAR,所有资源从类路径加载,无需依赖磁盘文件。
- 配置WildFly Maven插件的
bootable-jar特性,打包完成后直接运行即可,还能自定义剔除不需要的服务器功能,进一步缩减JAR大小。
3. OpenLiberty 可执行JAR
OpenLiberty也支持类似的打包方式,使用liberty-maven-plugin的package目标,将includeServer设置为true,打包后的JAR会包含服务器和你的应用,直接运行就能启动,所有资源均从类路径加载。
关键注意事项
- 你的应用需要使用**Jakarta EE 9+**的API,也就是把原有的
javax.*命名空间替换为jakarta.*,这是当前Jakarta EE的标准规范,所有新的服务器功能都基于此版本。 - 避免使用直接读取磁盘文件的代码(比如
new File(...)),改用ClassLoader.getResourceAsStream()从类路径加载资源,这样在JAR内部也能正常访问。
内容的提问来源于stack exchange,提问作者fdreger
相关产品推荐
相关产品推荐

