Maven 属性与资源过滤

在之前的章节中,我们已经介绍了 Maven 如何使用 Profile 来进行构建。类似的,对于 Maven 来说,还有很多其他的资源或者属性,而这些资源或者属性也都是可以进行过滤的,这一小节中,我们就重点介绍一下在什么情况下,需要过滤这些,并且要如何进行操作。

1. 属性

首先,我们来介绍一下 Maven 的属性特性。其实,在我们之前的章节中,一直都有在使用 Maven 的属性。例如我们在引入 Spring 框架的时候,将 Spring 框架的版本号信息抽象出来,放到 properties 节点中去,在使用这个版本号的时候,可以通过${}来引用。

<properties>
    <spring.version>4.0.2.RELEASE</spring.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

我们都知道抽象了spring.version属性之后,可以减少我们很多的工作量,而且也便于我们对 pom.xml 文件的管理。在 Maven 的世界中,这只是其中一种属性。那我们来介绍一下 Maven 的属性的种类。

  • 内置属性: Maven 的内置属性主要有两个,一个是${basedir}用来表示项目的根目录,另一个是${version}用来表示项目的版本号;
  • POM属性: 用来引用 pom.xml 文件中对应元素的值。一般来说,可以用${project.*}来表示,例如:${project.groupId}就是用来表示项目的 groupId 信息;
  • 自定义属性: 这个比较容易理解,就像我们上面例子中的${spring.version}就属于自定义属性的范围;
  • Settings属性: 与 POM 属性类似。通常使用${settings.*}来表示,Settings 属性用来指向 settings.xml 文件中的属性,例如:${settings.localrepository}可以用来表示本地仓库的地址;
  • Java系统属性: 所有 Java 的系统属性都可以通过 Maven 属性来引用。我们在使用之前可以通过mvn help:system命令来查看对应的属性;
  • 环境变量属性: 所有的环境变量属性都可以通过 Maven 属性来引用。通常用 ${env.*}来表示。

我们在很多地方都可以用到 Maven 属性,例如我们的示例项目中,多模块直接互相引用的时候,我们会用到${project.groupId}${project.version},来管理项目内部依赖。会用到${project.basedir}来指定项目配置文件的路径。

2. Profile

这里就是之前章节中讲到的 Profile ,所以在这里,我们就不做过多的介绍,可以移步到《Maven 使用 Profile 构建》一节进行学习。

3. 资源过滤

我们使用 Maven 资源过滤的目的和使用 Profile 的目的很大程度上是类似的,就是为了增强项目构建的可移植性。之前我们在 Profile 的章节中,讲到了在构建项目的时候,激活对应的 Profile 来使用对应的配置,当时我们把配置都放在了配置文件中,因此,如果有多套环境的话,那么配置文件就相应的需要多套。

这里,我们换一种方式来进行资源过滤。在讲 Profile 的章节中,我们使用 mall-order 模块来演示,这次我们换为 mall-delivery 模块来演示。

首先在 src\main\resources目录下添加application.yml文件,用作配置文件。文件中的内容如下:

spring:
  datasource:
    driver-class-name: ${database.driverClass}
    username: ${database.username}
    password: ${database.password}
    url: ${database.url}
    type: com.alibaba.druid.pool.DruidDataSource

这里,可以看到,我们使用了${}的方式来引用属性,这个属性可以定义在pom.xml文件中。

接下来,我们就在pom.xml 文件中配置对应的属性。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

<profiles>
    <profile>
	    <id>dev</id>
    	<properties>
            <database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
            <database.url>jdbc:mysql://localhost:3306/dev</database.url>
            <database.username>userNameDev</database.username>
            <database.password>passwordDev</database.password>
		</properties>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
            <database.url>jdbc:mysql://localhost:3307/test</database.url>
	        <database.username>userNameTest</database.username>
            <database.password>passwordTest</database.password>
        </properties>
        </profile>
</profiles>

通常情况下,资源过滤是关闭的,如果需要开启,则需要我们手动设置 <filtering>true</filtering>。默认关闭也是为了防止在构建的过程中发生一些不必要的过滤情况。

这里,我们分别配置了开发环境的数据库信息和测试环境的数据库信息(其实也是使用的 Profile 的方式)。其中 properties 节点配置了我们自定义的属性,其与我们刚刚在application.yml文件中配置的占位符是一样的。

接下来,我们进行项目构建可以指定对应的 Profile,执行 Maven 命令mvn clean package -Pdev。构建完成后,我们可以查看target\classes目录下的构建结果,会发现配置文件中的确是用的开发环境的 Profile,目的达成。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: userNameDev
    password: passwordDev
    url: jdbc:mysql://localhost:3306/dev
    type: com.alibaba.druid.pool.DruidDataSource

以上的配置,还可以进行一下修改。由于我们平时更多的是在用开发环境的配置,因此,我们可以把开发环境的配置单独放置出来。

<build>
	...
</build>
<properties>
    <database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
    <database.url>jdbc:mysql://localhost:3306/dev</database.url>
	<database.username>userNameDev</database.username>
    <database.password>passwordDev</database.password>
</properties>

<profiles>
    <profile>
        <id>test</id>
        <properties>
            <database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
            <database.url>jdbc:mysql://localhost:3307/test</database.url>
	        <database.username>userNameTest</database.username>
            <database.password>passwordTest</database.password>
        </properties>
        </profile>
</profiles>

这样修改之后,我们在进行开发环境构建的时候,不需要添加额外的参数,直接执行命令mvn clean package即可正常构建。而当我们需要构建其他环境程序包的时候,则在命令后面添加对应的参数。

4. 小结

本文,我们承接《Maven 使用 Profile 构建》一节,继续介绍 Maven 的属性和资源过滤,学了这两节之后,能够更方便,更明晰的管理 pom.xml 文件中的依赖,也让多环境构建变得更加简单。