介绍前我们先看一个问题,比如我们有一个maven项目结构如下:
一般我们都把一些配置文件放到像 src/main/resources/jdbc.properties
这样的文件中。但是文件里我们更多的放的还是变量,内容如下:
jdbc.driverClassName=${jdbc.driverClassName}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
jdbc.validationQuery=${jdbc.validationQuery}
具体的值我们会放到 pom.xml
中,用
来配置,如下所示代码:
xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.qyf404groupId>
<artifactId>learn-mavenartifactId>
<version>1.0-SNAPSHOTversion>
<profiles>profiles>
<properties>
<jdbc.driverClassName>com.mysql.jdbc.Driverjdbc.driverClassName>
<jdbc.url>jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=truejdbc.url>
<jdbc.username>rootjdbc.username>
<jdbc.password>jdbc.password>
<jdbc.validationQuery>SELECT 1 + 1jdbc.validationQuery>
properties>
<build>
<resources>
<resource>
<filtering>truefiltering>
<directory>${project.basedir}/src/main/resourcesdirectory>
<includes>
<include>*.propertiesinclude>
includes>
resource>
resources>
build>
project>
按照上面的方式配置。我们执行 mvn package
后,在 target/classes/jdbc.properties
里可以看到配置文件被成功替换。
由于某些原因(比如配置文件项比较多,为了让 pom.xml
更精简),我们希望把这些配置项提取到一个properties文件中进行配置。
这时候就需要用到 properties-maven-plugin 了。properties-maven-plugin可以在执行maven命令时,读取指定properties文件中的配置项,来实现和pom.xml中配置
一样的效果。
还拿上面的例子说,比如我们把 pom.xml
中的配置项放到一个全局的 my.properties
中。
profiles/dev/my.properties
文件内容如下:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true
jdbc.username=root
jdbc.password=
jdbc.validationQuery=SELECT 1 + 1
pom.xml
我们把插件加进去,并把之前里面的配置项注释掉.
xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.qyf404groupId>
<artifactId>learn-mavenartifactId>
<version>1.0-SNAPSHOTversion>
<build>
<resources>
<resource>
<filtering>truefiltering>
<directory>${project.basedir}/src/main/resourcesdirectory>
<includes>
<include>*.propertiesinclude>
includes>
resource>
resources>
<plugins>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>properties-maven-pluginartifactId>
<version>1.0-alpha-2version>
<executions>
<execution>
<id>default-cliid>
<phase>initializephase>
<goals>
<goal>read-project-propertiesgoal>
goals>
<configuration>
<files>
<file>${user.dir}/profiles/dev/my.propertiesfile>
files>
configuration>
execution>
executions>
plugin>
plugins>
build>
project>
我们执行 mvn package
后,在 target/classes/jdbc.properties
里可以看到配置文件被成功替换。
把 pom.xml
里的配置项提取到properties文件中,这是properties-maven-plugin干的事情。但是我们用properties-maven-plugin要达到更好的效果。
想一个场景:
我们可以通过maven的profile来配上properties-maven-plugin实现针对不同环境的快速打包。
我们把项目做个改造,结构如下:
profiles/dev/my.properties
内容如下:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true
jdbc.username=root
jdbc.password=
jdbc.validationQuery=SELECT 1 + 1
profiles/test/my.properties
内容如下:
jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver
jdbc.url=jdbc:hsqldb:hsql://localhost/stocktest
jdbc.username=root
jdbc.password=
jdbc.validationQuery=SELECT 1 + 1
pom.xml
内容如下:
xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.qyf404groupId>
<artifactId>learn-mavenartifactId>
<version>1.0-SNAPSHOTversion>
<build>
<resources>
<resource>
<filtering>truefiltering>
<directory>${project.basedir}/src/main/resourcesdirectory>
<includes>
<include>*.propertiesinclude>
includes>
resource>
resources>
<plugins>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>properties-maven-pluginartifactId>
<version>1.0-alpha-2version>
<executions>
<execution>
<id>default-cliid>
<phase>initializephase>
<goals>
<goal>read-project-propertiesgoal>
<goal>write-project-propertiesgoal>
goals>
<configuration>
<files>
<file>${user.dir}/profiles/${profile.id}/my.propertiesfile>
files>
<outputFile>${build.directory}/profile.propertiesoutputFile>
configuration>
execution>
executions>
plugin>
plugins>
build>
<profiles>
<profile>
<id>devid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<profile.id>devprofile.id>
properties>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.31version>
<scope>runtimescope>
dependency>
dependencies>
profile>
<profile>
<id>testid>
<properties>
<profile.id>testprofile.id>
properties>
<dependencies>
<dependency>
<groupId>org.hsqldbgroupId>
<artifactId>hsqldbartifactId>
<version>2.2.6version>
<scope>runtimescope>
dependency>
dependencies>
profile>
profiles>
project>
我们现在只需要执行命令 mvn package -Pdev
或者 mvn package
就可以打一个开发的包。
执行命令 mvn package -Ptest
就可以打一个测试用的包。
而且在 target/profile.properties
里查看项目打包的全部maven用到的配置项。内容如下:
#Properties
#Wed Sep 23 19:06:47 CST 2015
jdbc.url=jdbc\:mysql\://localhost/stock?createDatabaseIfNotExist\=true&useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
jdbc.username=root
jdbc.validationQuery=SELECT 1 + 1
jdbc.password=
profile.id=dev
jdbc.driverClassName=com.mysql.jdbc.Driver
示例代码github地址: https://github.com/qyf404/learn-maven/tree/properties-maven-plugin