在JBoss上部署多WAR包时外部化Spring Boot配置文件的方案
这个场景我之前帮朋友处理过,其实JBoss本身就支持给单个部署的应用单独配置系统属性,完美解决你的问题,给你几个靠谱的方案:
解决方案1:给每个War包单独配置部署属性(首推)
JBoss允许在standalone.xml的<deployments>节点中,为每个部署的War包设置专属的系统属性,这样两个应用的spring.config.location就不会冲突了。
具体操作步骤:
- 打开你的JBoss配置文件
standalone.xml - 找到
<deployments>节点(如果没有,就手动添加在<server>节点内部) - 为每个War包添加单独的
<deployment>配置,示例代码如下:
<deployments> <!-- 配置warA的专属外部配置路径 --> <deployment name="warA.war" runtime-name="warA.war"> <properties> <property name="spring.config.location" value="/myPath/warA/application.properties"/> </properties> </deployment> <!-- 配置warB的专属外部配置路径 --> <deployment name="warB.war" runtime-name="warB.war"> <properties> <property name="spring.config.location" value="/myPath/warB/application.properties"/> </properties> </deployment> </deployments>
- 保存配置后重启JBoss,两个应用就会各自加载对应路径下的配置文件了。
这个方案的优势是完全隔离两个应用的配置,不需要修改任何应用代码,所有配置都在JBoss端完成,后续维护起来也很方便。
解决方案2:结合Spring Boot的Profile特性
如果不想在standalone.xml里逐个配置部署,也可以用Spring Boot的Profile特性来区分:
- 给每个应用设置专属的Profile:比如warA用
warA,warB用warB - 在JBoss的全局系统属性里设置
spring.config.location=/myPath/(指向配置根目录) - 分别在
/myPath/warA/下创建application-warA.properties,/myPath/warB/下创建application-warB.properties - 接下来给每个应用单独指定激活的Profile:
- 可以在每个War包内部的
application.properties里添加spring.profiles.active=warA(对应warA)和spring.profiles.active=warB(对应warB) - 或者同样在
standalone.xml的部署配置里给每个应用设置spring.profiles.active属性
- 可以在每个War包内部的
不过这个方案需要调整配置文件的命名,不如第一个方案直接贴合你的需求,但也是一种可行的思路。
解决方案3:修改Spring Boot应用的启动逻辑(不推荐)
如果上面的部署端配置都不适合,也可以在每个Spring Boot应用的启动类里指定外部配置路径,比如:
@SpringBootApplication public class WarAApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(WarAApplication.class) .properties("spring.config.location=/myPath/warA/application.properties"); } public static void main(String[] args) { SpringApplication.run(WarAApplication.class, args); } }
但这个方案的缺点是灵活性太差,如果后续要修改配置路径,必须重新打包War包,所以一般不推荐这种硬编码的方式。
内容的提问来源于stack exchange,提问作者cloooze
相关产品推荐
相关产品推荐

