最近遇到一个需求,把SpringBoot项目的配置文件放到Jar包外面,Jar包内不包含多余配置文件,Jar包运行时指定外部配置文件启动。我的配置文件放在src/main/resources/config下,打包时拷贝到Jar包同级config目录下(SpringBoot默认支持读取Jar包同级config文件夹中的配置),具体解决方案如下:
- 使用maven-jar-plugin插件移除配置文件将其不打包进jar包中
- 使用maven-resources-plugin插件将需要复制的文件复制到指定路径(例:将配置文件提取到指定路径)
Maven配置:
<!--声明多环境-->
<profiles>
<profile>
<!-- 本地开发环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
<modifier></modifier>
</properties>
<activation>
<!-- 默认的,不加参数时执行这个profile -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
<modifier>-test</modifier>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
<modifier>-prod</modifier>
</properties>
</profile>
</profiles>
<build>
<plugins>
<!-- 复制指定环境配置文件到指定目录 -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources/config</directory>
<includes>
<include>application.yml</include>
<include>application-${profiles.active}.yml</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}/config</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- jar包内剔除所有配置文件 -->
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!--不打入jar包的文件类型或者路径-->
<excludes>
<exclude>config/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
最后执行mvn clean package -P prod