前言:Maven 是基于 Java 编写的
- 属性:类比 Java 的属性(变量),可复用。
- 版本管理规范:类比 Java 对象的命名规范,清晰易懂。
1、属性
-
自定义属性
作用:等同于定义变量,方便统一维护
定义格式:<!--定义自定义属性--> <properties> <spring.version>5.1.9.RELEASE</spring.version> <junit.version>4.12</junit.version> </properties>
调用格式:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
-
内置属性
作用:使用Maven内置属性,快速配置
调用格式:${basedir} ${version}
-
Setting属性
作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式:${settings.localRepository}
-
Java系统属性
作用:读取Java系统属性
调用格式:${user.home}
系统属性查询方式:
mvn help:system
-
环境变量属性
作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式:${env.JAVA_HOME}
环境变量属性查询方式:
mvn help:system
2、版本管理规范
在使用 Spring 等开源项目时,会注意到依赖坐标的版本都带有后缀(如:RELEASE)。
这就是版本管理规范,命名规范
常用工程版本
- SNAPSHOT:快照版
- 项目开发过程中临时输出的版本,称为快照版本
- 快照版本会随着开发的进展不断更新
- RELEASE:发布版
- 项目开发到一定阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的
- 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。
其它常见版本
-
alpha:内测版。
- bug 多,不稳定
- 不断添加新功能
-
beta:公测版。
- bug 较多,不稳定(比 alpha 完善一点)
- 不断添加新功能
-
纯数字版
工程版本号约定
- 规范:主版本.次版本.增量版本.里程碑版本
- 主版本:重大架构变更,如 Spring 5.x.x 相对于 Spring 4.x.x
- 次版本:较大功能增加或变更,或全面系统的修复 bug。
- 增量版本:重大 bug 修复
- 里程碑版本:版本内部的里程碑,相比下一个正式版本来说还不太稳定,需待更多测试。
- 示例:5.1.9.RELEASE
----
1、属性
1.1、问题分析
讲解内容之前,我们还是先来分析问题:
前面我们已经在父工程中的dependencyManagement标签中对项目中所使用的jar包版本进行了统一的管理,但是如果在标签中有如下的内容:
你会发现,如果我们现在想更新Spring的版本,你会发现我们依然需要更新多个jar包的版本,这样的话还是有可能出现漏改导致程序出问题,而且改起来也是比较麻烦。
问题清楚后,我们需要解决的话,就可以参考咱们java基础所学习的变量,声明一个变量,在其他地方使用该变量,当变量的值发生变化后,所有使用变量的地方,就会跟着修改,即:
1.2、解决步骤
1.2.1、父工程中定义属性
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
</properties>
1.2.2、修改依赖的 version
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
此时,我们只需要更新父工程中properties标签中所维护的jar包版本,所有子项目中的版本也就跟着更新。当然除了将spring相关版本进行维护,我们可以将其他的jar包版本也进行抽取,这样就可以对项目中所有jar包的版本进行统一维护,如:
<!--定义属性-->
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
</properties>
2、配置文件加载属性
Maven中的属性我们已经介绍过了,现在也已经能够通过Maven来集中管理Maven中依赖jar包的版本。但是又有新的需求,就是想让Maven对于属性的管理范围能更大些,比如我们之前项目中的jdbc.properties
,这个配置文件中的属性,能不能也来让Maven进行管理呢?
答案是肯定的,具体的实现步骤为:
2.1、父工程定义属性
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
2.2、jdbc.properties文件中引用属性
在jdbc.properties,将jdbc.url的值直接获取Maven配置的属性
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=root
2.3、设置maven过滤文件范围
Maven在默认情况下是从当前项目的src\main\resources
下读取文件进行打包。现在我们需要打包的资源文件是在maven_02_ssm下,需要我们通过配置来指定下具体的资源目录。
<build>
<resources>
<!--设置资源目录-->
<resource>
<directory>../maven_02_ssm/src/main/resources</directory>
<!--设置能够解析${},默认是false -->
<filtering>true</filtering>
</resource>
</resources>
</build>
说明:directory路径前要添加../
的原因是maven_02_ssm相对于父工程的pom.xml路径是在其上一层的目录中,所以需要添加。
修改完后,注意maven_02_ssm项目的resources目录就多了些东西,如下:
2.4、测试生效
测试的时候,只需要将maven_02_ssm项目进行打包,然后观察打包结果中最终生成的内容是否为Maven中配置的内容。
上面的属性管理就已经完成,但是有一个问题没有解决,因为不只是maven_02_ssm项目需要有属性被父工程管理,如果有多个项目需要配置,该如何实现呢?
方式一:
<build>
<resources>
<!--设置资源目录,并设置能够解析${}-->
<resource>
<directory>../maven_02_ssm/src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>../maven_03_pojo/src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
</build>
可以配,但是如果项目够多的话,这个配置也是比较繁琐
方式二:
<build>
<resources>
<!--
${project.basedir}: 当前项目所在目录,子项目继承了父项目,
相当于所有的子项目都添加了资源目录的过滤
-->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
说明:打包的过程中如果报如下错误:
原因就是Maven发现你的项目为web项目,就会去找web项目的入口web.xml[配置文件配置的方式],发现没有找到,就会报错。
解决方案1:在maven_02_ssm项目的src\main\webapp\WEB-INF\
添加一个web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
解决方案2: 配置maven打包war时,忽略web.xml检查
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
上面我们所使用的都是Maven的自定义属性,除了${project.basedir},它属于Maven的内置系统属性。
在Maven中的属性分为:
- 自定义属性(常用)
- 内置属性
- Setting属性
- Java系统属性
- 环境变量属性
具体如何查看这些属性:
在cmd命令行中输入mvn help:system
具体使用,就是使用 ${key}
来获取,key为等号左边的,值为等号右边的,比如获取红线的值,对应的写法为 ${java.runtime.name}
。