本次将介绍两个内容,分别是:
我们先来分析一下问题:
前面在父工程中的dependencyManagement
标签中对项目中所使用的jar
包版本进行了统一的管理,但是如果在标签中有如下的内容:
你会发现,如果我们现在想更新Spring
的版本,你会发现我们依然需要更新多个jar
包的版本,这样的话还是有可能出现漏改导致程序出问题,而且改起来也是比较麻烦。
问题清楚后,我们需要解决的话,就可以参考变量,声明一个变量,在其他地方使用该变量,当变量的值发生变化后,所有使用变量的地方,就会跟着修改,即:
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<spring.version>5.2.12.RELEASEspring.version>
<javax.servlet.api>3.1.0javax.servlet.api>
<mybatis>3.5.10mybatis>
<mysql.connector.java>8.0.30mysql.connector.java>
<jackson.databind>2.9.8jackson.databind>
<mybatis.spring>2.0.7mybatis.spring>
<druid>1.2.11druid>
<lombok>1.18.24lombok>
<junit>4.13.2junit>
properties>
version
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>${javax.servlet-api.version}version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>${mybatis.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql-connector-java.version}version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>${jackson-databind.version}version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>${mybatis-spring.version}version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>${druid.version}version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
<scope>providedscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>${junit.version}version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
此时,我们只需要更新父工程中properties
标签中所维护的jar
包版本,所有子项目中的版本也就跟着更新。当然除了将spring
相关版本进行维护,我们可以将其他的jar
包版本也进行抽取,这样就可以对项目中所有jar
包的版本进行统一维护,如:
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<spring.version>5.2.12.RELEASEspring.version>
<javax.servlet-api.version>3.1.0javax.servlet-api.version>
<mybatis.version>3.5.10mybatis.version>
<mysql-connector-java.version>8.0.30mysql-connector-java.version>
<jackson-databind.version>2.9.8jackson-databind.version>
<mybatis-spring.version>2.0.7mybatis-spring.version>
<druid.version>1.2.11druid.version>
<lombok.version>1.18.24lombok.version>
<junit.version>4.13.2junit.version>
properties>
Maven
中的属性我们已经介绍过了,现在也已经能够通过Maven
来集中管理Maven
中依赖jar
包的版本。但是又有新的需求,就是想让Maven
对于属性的管理范围能更大些,比如我们之前项目中的jdbc.properties
,这个配置文件中的属性,能不能也来让Maven
进行管理呢?
答案是肯定的,具体的实现步骤为:
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/mybatisjdbc.url>
<jdbc.driver>com.mysql.cj.jdbc.Driverjdbc.driver>
<jdbc.username>rootjdbc.username>
<jdbc.password>rootjdbc.password>
properties>
jdbc.properties
文件中引用属性在jdbc.properties
,将属值直接获取Maven
配置的属性
jdbc.driver=${jdbc.driver}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
maven
过滤文件范围Maven
在默认情况下是从当前项目的src\main\resources
下读取文件进行打包。现在我们需要打包的资源文件是在maven_02_ssm下,需要我们通过配置来指定下具体的资源目录。
<build>
<resources>
<resource>
<directory>../maven_02_ssm/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
build>
说明: directory
路径前要添加../
的原因是maven_02_ssm相对于父工程的pom.xml路径是在其上一层的目录中,所以需要添加。
修改完后,注意maven_02_ssm项目的resources
目录就多了些东西,如下:
测试的时候,只需要将maven_02_ssm项目进行打包,然后观察打包结果中最终生成的内容是否为Maven
中配置的内容。
上面的属性管理就已经完成,但是有一个问题没有解决,因为不只是maven_02_ssm项目需要有属性被父工程管理,如果有多个项目需要配置,该如何实现呢?
方式一:
<build>
<resources>
<resource>
<directory>../maven_02_ssm/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
<resource>
<directory>../maven_03_ssm_pojo/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
...
resources>
build>
可以配,但是如果项目够多的话,这个配置也是比较繁琐
方式二:
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
build>
说明: 打包的过程中如果报如下错误:
原因就是Maven
发现你的项目为web
项目,就会去找web
项目的入口web.xml
[配置文件配置的方式],发现没有找到,就会报错。
解决方案1:在maven_02_ssm项目的src\main\webapp\WEB-INF\
添加一个web.xml
文件
<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.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.2.3version>
<configuration>
<failOnMissingWebXml>falsefailOnMissingWebXml>
configuration>
plugin>
plugins>
build>
上面我们所使用的都是Maven
的自定义属性,除了${project.basedir}
,它属于Maven
的内置系统属性。
在Maven
中的属性分为:
属性分类 | 引用格式 | 示例 |
---|---|---|
自定义属性 | ${自定义属性名} | ${spring.version} |
内置属性 | ${内置属性名} | ${basedir}、${version} |
Setting属性 | ${Setting.属性名} | ${settings.localRepository} |
Java系统属性 | ${系统属性分类.系统属性名} | ${user.home} |
环境变量属性 | ${env.环境变量属性} | ${env.JAVE_HOME} |
具体如何查看这些属性:
在cmd
命令行中输入mvn help:system
具体使用,就是使用 ${key}
来获取,key
为等号左边的,值为等号右边的,比如获取红线的值,对应的写法为 ${java.runtime.name}
。
关于这个版本管理解决的问题是,在Maven
创建项目和引用别人项目的时候,我们都看到过如下内容:
这里面有两个单词,SNAPSHOT
和RELEASE
,它们所代表的含义是什么呢?
我们打开Maven
仓库地址https://mvnrepository.com/
在我们jar
包的版本定义中,有两个工程版本用的比较多:
SNAPSHOT
(快照版本)
RELEASE
(发布版本)
除了上面的工程版本,我们还经常能看到一些发布版本:
alpha版
:内测版,bug多不稳定内部版本不断添加新功能beta版
:公测版,不稳定(比alpha
稳定些),bug相对较多不断添加新功能