在项目开发过程中,通常会有多套环境,如dev环境,SIT环境,uat环境,演练环境及生产环境,每个环境的配置都不相同,如何根据需要打不同环境的包呢,Maven的profile为我们提供了简单快捷的配置方式,通过激活不同的配置,就可以打出相应环境的包
一、工程结构
我的工程结构如下
在src/main/resources/prop/目录下,分别有dev,sit,prod三个环境的配置,接下来,我们需要根据配置,打不同环境的包
二、pom.xml文件中定义不同环境的profile配置
pom.xml文件的profile配置如下
<profiles>
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>sit</id>
<properties>
<profiles.active>sit</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
说明:
1、在profiles标签中,定义了三个profile,分别对应dev,sit,prod环境,每个profile中都有一个唯一的id,后面打包时,会根据这个id,激活对应的环境,就可以打到对应环境的包
2、使用activeByDefault 标签属性设置默认激活的环境,这里配置的是dev环境,即在开发时,默认使用开发环境的配置
在编译打包时,希望打出来的包中的资源文件的结构和工程的结果一致,因此在pom.xml中需要对资源文件进行一些设置,如下
<build>
<finalName>mcc.base.web</finalName>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources/prop/</directory>
<excludes>
<exclude>dev/*</exclude>
<exclude>sit/*</exclude>
<exclude>prod/*</exclude>
</excludes>
<includes>
<include>wf/**</include><!--wf目录下所有文件及文件夹的内容 -->
</includes>
<targetPath>prop/</targetPath><!--wf目录下所有文件及文件夹的内容都输出到prop目录下 -->
</resource>
<!-- 将对应激活的环境的配置文件,输出到prop目录下 -->
<resource>
<directory>${project.basedir}/src/main/resources/prop/${profiles.active}</directory>
<targetPath>prop/</targetPath>
<filtering>true</filtering>
</resource>
<!-- 其他资源文件,默认输出在classes目录下 -->
<resource>
<directory>${project.basedir}/src/main/resources/</directory>
<includes>
<include>*/*</include><!-- 这样才能包含一层结构的子文件夹及内容,如excel目录,spring目录,sso目录 -->
<include>*</include><!-- resources目录下所有的文件,如dp-apps.xml文件,不包括文件夹 -->
</includes>
</resource>
</resources>
</build>
说明:
1、第一个resource标签,排除了prop目录下dev,sit,prod目录下的所有文件,但是prop目录下还有wf文件夹,因此使用include将wf文件夹及子文件包含进来,并且输出到prop目录下
2、第二个resource标签,将对应激活的环境的配置文件,输出到prop目录下
3、第三个resource标签,将其他资源文件,默认输出在classes目录下
在打包之前,先看下已经打好的包的结构,方便理解上面这三个resource标签配置的作用,包的WEB-INF/classes目录文件如下,这样就和我们在eclipse中的工程结构一致了
文件夹sso,spring,excel,文件logback-dp.xml,dp-mvc.xml等能在classes目录下,主要是第三个resource标签配置的效果,如果没有这个标签的配置,这些文件不会在classes目录中
再来看prop目录下的内容
对应环境的配置文件,能在prop目录下,主要是第二个resource标签配置的效果,而wf目录及子文件已经在prop目录下了,这是第一个resource标签配置的效果
完整的pom.xml文件内容如下
<profiles>
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>sit</id>
<properties>
<profiles.active>sit</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
<build>
<finalName>mcc.base.web</finalName>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources/prop/</directory>
<excludes>
<exclude>dev/*</exclude>
<exclude>sit/*</exclude>
<exclude>prod/*</exclude>
</excludes>
<includes>
<include>wf/**</include><!--wf目录下所有文件及文件夹的内容 -->
</includes>
<targetPath>prop/</targetPath><!--wf目录下所有文件及文件夹的内容都输出到prop目录下 -->
</resource>
<!-- 将对应激活的环境的配置文件,输出到prop目录下 -->
<resource>
<directory>${project.basedir}/src/main/resources/prop/${profiles.active}</directory>
<targetPath>prop/</targetPath>
<filtering>true</filtering>
</resource>
<!-- 其他资源文件,默认输出在classes目录下 -->
<resource>
<directory>${project.basedir}/src/main/resources/</directory>
<includes>
<include>*/*</include><!-- 这样才能包含一层结构的子文件夹及内容,如excel目录,spring目录,sso目录 -->
<include>*</include><!-- resources目录下所有的文件,如dp-apps.xml文件,不包括文件夹 -->
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
三、激活配置,打包
输入maven命令,通过-P指定要激活的环境,就会自动到pom.xml文件中匹配对应的profile,如下命令,要打生包包,-P后面的参数设置为prod,会自动匹配到属性id为prod的profile,打包时,会将prod目录下的配置文件打到包中
mvn clean install -P prod
如果是eclipse中,配置如下
Name:名称,随便取一个都可以
base directory:项目的根目录
Goals:要执行的maven命令 clean install -P prod
Skip Test:打勾表示跳过测试
执行完打包命令后,出现如下结果,说明打包成功
[INFO] Reactor Summary:
[INFO]
[INFO] xxx.base 0.0.1-SNAPSHOT ............................ SUCCESS [ 0.962 s]
[INFO] xxx.base.model ..................................... SUCCESS [ 5.995 s]
[INFO] xxx.base.dao ....................................... SUCCESS [ 2.662 s]
[INFO] xxx.base.service ................................... SUCCESS [ 27.902 s]
[INFO] xxx.base.web 0.0.1-SNAPSHOT ........................ SUCCESS [02:58 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:35 min
[INFO] Finished at: 2019-03-16T00:48:52+08:00