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 模块来演示。
spring:
datasource:
driver-class-name: ${database.driverClass}
username: ${database.username}
password: ${database.password}
url: ${database.url}
type: com.alibaba.druid.pool.DruidDataSource
<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>
这里,我们分别配置了开发环境的数据库信息和测试环境的数据库信息(其实也是使用的 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:/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>