Wildfly Web应用中基于ServiceLoader实现模块化jar/插件加载方案咨询
Wildfly环境下ServiceLoader插件无修改WAR扩展方案
方案1:修复官方modules配置(推荐)
你此前使用modules方案加载失败,核心是Wildfly模块默认不导出服务资源到应用类加载器,调整两处配置即可解决:
- 首先修改扩展模块的
module.xml配置,显式声明服务提供并配置导出权限
<module xmlns="urn:jboss:module:1.9" name="com.your.extension"> <resources> <resource-root path="your-extension.jar"/> </resources> <dependencies> <!-- 依赖公共接口所在的模块或应用依赖的核心模块,配置export=true导出给上层应用 --> <module name="com.your.common.interface" export="true"/> <module name="javax.api"/> </dependencies> <!-- 关键配置:声明模块提供的服务实现,供ServiceLoader扫描 --> <provides> <service name="com.your.PluginInterface" class="com.your.extension.PluginImpl"/> </provides> </module>
- 然后在WAR包的
WEB-INF目录下新增jboss-deployment-structure.xml,声明模块依赖并导入服务:
<jboss-deployment-structure> <deployment> <dependencies> <!-- services="import" 表示将模块的服务实现暴露给应用的ServiceLoader --> <module name="com.your.extension" services="import"/> </dependencies> </deployment> </jboss-deployment-structure>
以上配置仅需首次打包WAR时配置一次,后续新增扩展仅需在Wildfly的modules目录下新增对应模块即可,无需修改WAR包。
方案2:开启exploded文件夹部署
Wildfly原生支持文件夹形式的exploded部署,仅需修改部署扫描器配置开启即可:
- 通过
jboss-cli执行以下命令开启自动扫描部署文件夹:
/subsystem=deployment-scanner/scanner=default:write-attribute(name=auto-deploy-exploded,value=true)
- 配置完成后将WAR包解压为后缀为
.war的文件夹放入部署目录即可,后续新增扩展JAR直接放入文件夹内的WEB-INF/lib目录,Wildfly会自动识别变更重载应用,无需重新打包WAR。
方案3:配置外部扩展目录为类路径
如果不想使用文件夹部署,可直接配置外部目录作为应用的类路径组成部分:
- 在
WEB-INF/jboss-deployment-structure.xml中添加外部资源目录配置:
<jboss-deployment-structure> <deployment> <resources> <!-- path替换为你服务器上存放扩展JAR的外部目录绝对路径 --> <resource-root path="/opt/wildfly/extension-jars"/> </resources> </deployment> </jboss-deployment-structure>
后续新增扩展JAR直接放入该外部目录,触发应用重载即可生效,无需修改WAR包。
内容的提问来源于stack exchange,提问作者Fire For Effect
相关产品推荐
相关产品推荐

