学习Maven之Properties Maven Plugin(编译时动态获取properties参数)

1.properties-maven-plugin是个什么鬼?

介绍前我们先看一个问题,比如我们有一个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 中,用 <properties> 来配置,如下所示代码:

<?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.0</modelVersion>
  <groupId>com.qyf404</groupId>
  <artifactId>learn-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <profiles></profiles>
  <properties>
    <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
    <jdbc.url>jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true</jdbc.url>
    <jdbc.username>root</jdbc.username>
    <jdbc.password></jdbc.password>
    <jdbc.validationQuery>SELECT 1 + 1</jdbc.validationQuery>
  </properties>
  <build>
    <resources>
      <resource>
        <filtering>true</filtering>  <!-- 加上filter会过滤该资源路径中的文件 -->
        <directory>${project.basedir}/src/main/resources</directory>
        <includes>
          <include>*.properties</include>
        </includes>
      </resource>
    </resources>
  </build>
</project>

按照上面的方式配置。我们执行 mvn package 后,在 target/classes/jdbc.properties 里可以看到配置文件被成功替换。

由于某些原因(比如配置文件项比较多,为了让 pom.xml 更精简),我们希望把这些配置项提取到一个properties文件中进行配置。

这时候就需要用到 properties-maven-plugin 了。properties-maven-plugin可以在执行maven命令时,读取指定properties文件中的配置项,来实现和pom.xml中配置 <properties> 一样的效果。

2.properties-maven-plugin怎么用?

还拿上面的例子说,比如我们把 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.0</modelVersion>
<groupId>com.qyf404</groupId>
<artifactId>learn-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<properties>-->
  <!--<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>-->
  <!--<jdbc.url>jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true</jdbc.url>-->
  <!--<jdbc.username>root</jdbc.username>-->
  <!--<jdbc.password></jdbc.password>-->
  <!--<jdbc.validationQuery>SELECT 1 + 1</jdbc.validationQuery>-->
<!--</properties>-->
<build>
  <resources>
    <resource>
      <filtering>true</filtering> <!-- 加上filter会过滤该资源路径中的文件 -->
      <directory>${project.basedir}/src/main/resources</directory>
      <includes>
        <include>*.properties</include>
      </includes>
    </resource>
  </resources>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>properties-maven-plugin</artifactId>
      <version>1.0-alpha-2</version>
      <executions>
        <execution>
          <id>default-cli</id>
          <phase>initialize</phase>
          <goals>
            <goal>read-project-properties</goal>
          </goals>
          <configuration>
            <files>
              <file>${user.dir}/profiles/dev/my.properties</file>
            </files>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
</project>

我们执行 mvn package 后,在 target/classes/jdbc.properties 里可以看到配置文件被成功替换。

3.进阶

把 pom.xml 里的配置项提取到properties文件中,这是properties-maven-plugin干的事情。但是我们用properties-maven-plugin要达到更好的效果。

想一个场景:

  • 我们的项目有开发环境的配置,测试环境的配置;
  • 而且开发环境是mysql数据库,测试环境是hsqldb数据库;
  • 最后还要在一个文件中统一打印出配置项内容。

我们可以通过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.0</modelVersion>
<groupId>com.qyf404</groupId>
<artifactId>learn-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<properties>-->
<!--<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>-->
<!--<jdbc.url>jdbc:mysql://localhost/stock?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true</jdbc.url>-->
<!--<jdbc.username>root</jdbc.username>-->
<!--<jdbc.password></jdbc.password>-->
<!--<jdbc.validationQuery>SELECT 1 + 1</jdbc.validationQuery>-->
<!--</properties>-->
<build>
  <resources>
    <resource>
      <filtering>true</filtering> <!-- 加上filter会过滤该资源路径中的文件 -->
      <directory>${project.basedir}/src/main/resources</directory>
      <includes>
        <include>*.properties</include>
      </includes>
    </resource>
  </resources>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>properties-maven-plugin</artifactId>
      <version>1.0-alpha-2</version>
      <executions>
        <execution>
          <id>default-cli</id>
          <phase>initialize</phase>
          <goals>
            <goal>read-project-properties</goal>
            <goal>write-project-properties</goal>
          </goals>
          <configuration>
            <files>
              <!--<file>${user.dir}/profiles/dev/my.properties</file>-->
              <file>${user.dir}/profiles/${profile.id}/my.properties</file>
            </files>
            <!--输出全部配置项到指定文件-->
            <outputFile>${build.directory}/profile.properties</outputFile>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
<profiles>
  <profile>
    <id>dev</id>
    <activation> <!-- 默认激活,即默认值 -->
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <profile.id>dev</profile.id>
    </properties>
    <dependencies> <!-- 可以添加依赖包配置 -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.31</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </profile>
  <profile>
    <id>test</id>
    <properties>
      <profile.id>test</profile.id>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>2.2.6</version>
        <scope>runtime</scope>
      </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

更多关于p roperties-maven-plugin 请参阅这里: http://www.mojohaus.org/properties-maven-plugin/index.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值