写点什么

[Maven 进阶] 属性与版本管理

作者:fake smile by
  • 2022 年 9 月 17 日
    黑龙江
  • 本文字数:2908 字

    阅读完需:约 10 分钟

属性

问题引入

前面我们已经在父工程中的 dependencyManagement 标签中对项目中所使用的 jar 包版本进行了统一的管理,但是如果在标签中有如下的内容:



你会发现,如果我们现在想更新 Spring 的版本,你会发现我们依然需要更新多个 jar 包的版本,这样的话还是有可能出现漏改导致程序出问题,而且改起来也是比较麻烦。


问题清楚后,我们需要解决的话,就可以参考咱们 java 基础所学习的变量,声明一个变量,在其他地方使用该变量,当变量的值发生变化后,所有使用变量的地方,就会跟着修改,即:


解决步骤

步骤 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>
复制代码

步骤 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>
复制代码

配置文件加载属性

Maven 中的属性我们已经介绍过了,现在也已经能够通过 Maven 来集中管理 Maven 中依赖 jar 包的版本。但是又有新的需求,就是想让 Maven 对于属性的管理范围能更大些,比如我们之前项目中的jdbc.properties,这个配置文件中的属性,能不能也来让 Maven 进行管理呢?


答案是肯定的,具体的实现步骤为:

步骤 1:父工程定义属性

<properties>   <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url></properties>
复制代码

步骤 2:jdbc.properties 文件中引用属性

在 jdbc.properties,将 jdbc.url 的值直接获取 Maven 配置的属性


jdbc.driver=com.mysql.jdbc.Driverjdbc.url=${jdbc.url}jdbc.username=rootjdbc.password=***********
复制代码

步骤 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 目录就多了些东西,如下:


步骤 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}

版本管理

关于这个版本管理解决的问题是,在 Maven 创建项目和引用别人项目的时候,我们都看到过如下内容:



这里面有两个单词,SNAPSHOT 和 RELEASE,它们所代表的含义是什么呢?


我们打开 Maven 仓库地址https://mvnrepository.com/



在我们 jar 包的版本定义中,有两个工程版本用的比较多:


  • SNAPSHOT(快照版本)

  • 项目开发过程中临时输出的版本,称为快照版本

  • 快照版本会随着开发的进展不断更新

  • RELEASE(发布版本)

  • 项目开发到一定阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的

  • 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本


除了上面的工程版本,我们还经常能看到一些发布版本:


  • alpha 版:内测版,bug 多不稳定内部版本不断添加新功能

  • beta 版:公测版,不稳定(比 alpha 稳定些),bug 相对较多不断添加新功能

  • 纯数字版


对于这些版本,大家只需要简单认识下即可。

发布于: 刚刚阅读数: 4
用户头像

fake smile by

关注

还未添加个人签名 2022.07.31 加入

还未添加个人简介

评论

发布
暂无评论
[Maven进阶]属性与版本管理_maven_fake smile by_InfoQ写作社区