profile确实是一项很有用的功能,因为我们的项目的运行环境可以有几种,开发环境,测试环境,线上环境,意味着不同环境许多配置是不同的,比如数据库,缓存之类的。
如果不借助一些构建工具,那么我们需要每改变一个运行环境就修改一次项目的配置文件,这在大型项目中很不方便,因为每一次改动都有可能引入错误,众多的配置文件很有可能遗漏。其次开发也不方便,提交代码什么的需要注意配置文件。
但是借助了maven的prifile,我们就可以轻松应对项目的不同环境。下面是最近刚完成的一个小例子。
使用如下命令创建一个maven项目:
这个默认是用quick-start模板,所以在src/main没有resources目录,而我们的配置文件是要放在这个目录下的,所以,我们可以手动创建一个。
当然最开始没有target目录。默认情况下,maven的resources插件会把resources目录下的文件也打入jar中。
看一下这个配置文件,是一个数据库的例子:
database.jdbc.driverClass = ${db.driver}
database.jdbc.connectionURL = ${db.url}
database.jdbc.username = ${db.username}
database.jdbc.password = ${db.password}
注意这里并没有用明文,原因就是为了适用不同的环境。我们这里相当于只是定义了一个模板,具体的内容由相应的变量填充。这个叫做maven的资源过滤,需要我们在pom中配置一下,而这些变量的真实值也定义在pom中,当然不仅限于pom。
pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.liyao</groupId>
<artifactId>profile_test</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>development</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://192.168.1.2/test</db.url>
<db.username>development</db.username>
<db.password>development-pwd</db.password>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://192.168.1.2/production</db.url>
<db.username>production</db.username>
<db.password>production-pwd</db.password>
</properties>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
这里我们引入了一个junit的依赖,这个和例子无关。然后配置了profiles,profiles里定义了两个profile,每一个profile对应一种环境,每一个profile也有一个id,我们的模板里的内容就是在profile里定义,然后通过在构建时指明profile的id来决定启用哪一个profile。
然后我们使用mvn 命令构建,通过-P参数指定profile的id,比如:
mvn clean compile -Pdevelopment
mvn clean compile -Pproduction
运行后可以在classes目录下生成了一个内容被替换后的application.properties文件。
实际中,我们可以写一个不同的maven启动脚本来启动不同的环境。
当然这只是maven中激活profile的一种方法,即通过命令行参数给出profile的id。可是实现但是每一次运行都得给出参数。更好的做法是提供morning的选项。
那么我们可以:
1.在pom中而非prifile标签下定义properties。这样如果不指定profileid,就会使用pom中的默认值。
2.使用settings.xml,这个会放在用户目录下,我们可以定义其activeProfiles属性,里面是默认的激活profile。我们知道settings.xml是针对用户所有项目的,所以这个是一个很好的办法,因为开发人员不同项目的环境名字一般都是一样的,这样配置一份settings.xml就可以针对所有的项目使用,很方便,而且不需要额外给定参数。在本机是测试环境,在线上是线上环境。例如:
<activeProfiles>
<activeProfile>developemnt</activeProfile>
</activeProfiles>