Java Spring项目使用appassembler打包时如何外置配置文件
可行方案(零/低代码改动,无需手动修改启动脚本)
以下方案完全适配你现有的构建流程,不需要调整原有构建命令,即可实现配置文件外置、部署时直接修改配置无需解包重打jar的需求。
方案一:仅调整Maven插件配置,零业务代码改动
全程只需要修改pom.xml中的插件配置,不需要改动任何Java代码,执行原有构建命令即可直接生成符合要求的部署包。
- 配置
maven-jar-plugin,将需要外部修改的配置文件排除出项目jar包,示例配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <excludes> <!-- 按需调整排除规则,仅排除需要外部修改的配置类文件 --> <exclude>**/*.properties</exclude> <exclude>**/*.yml</exclude> <exclude>**/*.yaml</exclude> </excludes> </configuration> </plugin> - 调整
appassembler-maven-plugin配置,实现自动拷贝配置文件到外部目录、自动加classpath、自动写入启动参数三个核心能力,完全不需要手动修改生成的脚本,示例配置:<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>2.1.0</version> <configuration> <!-- 原有配置保留,比如主类、生成脚本名、兼容平台等 --> <programs> <program> <mainClass>com.xxx.YourProjectMainClass</mainClass> <id>your-app-name</id> </program> </programs> <!-- 新增以下配置 --> <!-- 开启配置文件自动拷贝 --> <copyConfigurationDirectory>true</copyConfigurationDirectory> <!-- 指向项目实际资源目录,和现有资源配置路径保持一致 --> <configurationSourceDirectory>src/main/resources</configurationSourceDirectory> <!-- 自动将外部配置目录加入启动classpath --> <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath> <!-- 配置文件输出到部署包根目录下的config文件夹 --> <configurationDirectory>config</configurationDirectory> <!-- 自动给所有生成的启动脚本写入JVM参数,指定外部配置路径,无需手动修改脚本 --> <extraJvmArguments>-Dspring.config.location=./config/</extraJvmArguments> </configuration> </plugin>
配置完成后执行原有构建命令mvn package appassembler:assemble -P dev,生成的部署包结构如下:
bin/:自动生成的Windows/Linux启动脚本,内置所有必要参数,无需手动修改lib/:项目jar包+所有依赖jar,内部不包含需要外置修改的配置文件config/:对应profile构建出的所有配置文件,部署时直接修改该目录下的端口、IP、账号凭证等配置,重启服务即可生效,不需要解压重打jar包。
方案二:少量代码改动,降低插件配置耦合
如果不想在插件中硬编码JVM参数,只需要极少量代码改动即可实现相同效果:
- 保留方案一中的
maven-jar-plugin配置、appassembler的配置目录拷贝+classpath配置,删除<extraJvmArguments>配置项即可。 - 如果是Spring Boot项目,不需要额外改代码:Spring Boot默认会优先加载jar包同级
config/目录下的配置文件,优先级高于jar包内部classpath下的配置,规则自动生效。 - 如果是传统Spring项目,只需要在启动类main方法的最开头加1行代码,指定外部配置加载路径即可:
public static void main(String[] args) { // 新增该行,指定优先加载config目录下的配置 System.setProperty("spring.config.additional-location", "./config/"); // 原有Spring启动逻辑保持不变 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // ...... }
如果是纯XML配置的Spring项目,也可以直接调整属性加载器的配置,增加file:./config/路径的配置文件扫描,将该路径优先级设置为高于classpath路径即可。
注意事项
- 配置jar包排除规则时,不要将不需要外部修改的类路径资源(比如MyBatis映射文件、内置静态配置等)排除,按需调整exclude规则即可。
- 多profile构建场景下,该配置完全兼容maven的profile资源过滤逻辑,会自动拷贝对应profile激活后替换完变量的配置文件到config目录,不会出现环境配置错乱问题。
- 上述配置会同时生成Windows(.bat)和Linux(.sh)平台的可用启动脚本,不需要针对不同系统单独适配参数。
内容的提问来源于stack exchange,提问作者Mehdi Alisoltani
相关产品推荐
相关产品推荐

