需求:资源文件根据不同的环境进行拆分,打包的时候只想根据目标环境将需要的资源文件包含进去。具体的资源环境如下图所示。
解决方案:
- pom.xml文件配置
首先是在待打包的资源文件中排除掉application-*.yml,
<resource> <directory>src/main/resources</directory> <excludes> <exclude>application-*.yml</exclude> <!--<exclude>dev/*</exclude>--><!--打包的时候排除特定文件下的文件--> </excludes> </resource>
然后再另起一个resource配置节,指向相同的文件夹,再将需要的配置文件包含进去
<resource> <directory>src/main/resources</directory> <includes> <include>application.yml</include> <include>application-${project}*.yml</include> </includes> </resource>
其中include节中*的意义表示通配符,如果想精确的打包某个yml文件,project变量保证全称即可,但是如果想打包pro开头的就设置project为pro就行了。
另外,默认情况下,要将所有的yml文件都build到target目录下,此时需要配置一个profile节,如下:
<profile> <id>dev-default</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <project> </project> </properties> </profile>
其中,project变量配置为空,这样配合resource节中的application-${project}*.yml配置,就会把application-开头的yml文件都build到指定的target文件夹下。
完整配置如下:
<build> <finalName>webTrainUse</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--fork : 如果没有该项配置devtools不会起作用,即应用不会restart --> <fork>true</fork> <addResources>true</addResources><!--支持静态文件热部署 --> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/webapp</directory> </resource> <resource> <directory>src/main/resources</directory> <excludes> <exclude>application-*.yml</exclude> <!--<exclude>dev/*</exclude>--><!--打包的时候排除特定文件下的文件--> </excludes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>application.yml</include> <include>application-${project}*.yml</include> <!--注意这里有个通配符 --> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> <!--定义打包环境变量,生产环境、测试环境、开发环境--> <profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <project>*</project><!--project为*,就可以将所有的yml文件都会build到指定的文件夹下--> </properties> </profile> <profile> <id>test</id> <properties> <project>test</project> </properties> </profile> <profile> <id>pro</id> <properties> <project>pro</project> </properties> </profile> </profiles>
2.mvn命令打包
mvn clean package -Ppro
其中-P后面的pro对应的是pom文件中profiles节中profile的id为pro的配置,其对应的project为produce,所以在下面的配置中的${project}就会被替换为
<resource> <directory>src/main/resources</directory> <includes> <include>application.yml</include> <include>application-${project}.yml</include> </includes> </resource>
使用mvn的前提是配置好了MAVEN_HOME环境变量:
如果需要指定的maven配置文件,则mvn命令格式如下:
mvn clean –s D:\apache-maven-3.5.3\settings2.xml package –Ppro
打完包之后的文件目录如下:
idea中设置参数进行打包
Maven Projects窗口中,右键要打包的项目中的pacekage,在右键菜单中可以看到create***的选项,如下图:
点击该选项之后,首先编写一个Name名称,如pro-outer,然后在弹出的菜单中编写Command Line命令行参数,在输入框中增加-Ppro-outer,pro-outer就是pom中profile节中的id值,如下图:
然后点击该窗口的applay按钮,关闭该窗口,然后在idea的工具类中可以看到如下图所示的内容
点击运行按钮,则执行打包操作
注意:
多模块项目,注意profile的id名称不要重复,否则在idea开发环境下会出异常,解决方式是在idea的maven-project窗口的最上方的profile文件夹,勾选要build到target文件夹的资源文件