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 文件中的依赖,也让多环境构建变得更加简单。