Maven实战读书笔记(14)

什么是版本管理?

版本管理是指项目整体版本的演变过程管理,如从1.0-SNAPSHOT到1.0再到1.1-SNAPSHOT

什么是版本控制?

版本控制是指借助版本控制工具(如Subversion)追踪代码的每一个变更

什么时候可以将快照版本更新为发布版本

1、所有自动化测试应当全部通过

2、项目没有配置任何快照版本的依赖

3、项目没有配置任何快照版本的插件

4、项目所包含的代码已经全部提交到版本控制系统中

Maven的版本号定义约束

可能有个版本号是这样的,1.3.4-beta-2

Maven的版本号定义约定是这样的,<主版本>.<次版本>.<增量版本>-<里程碑版本>

1、主版本:表示项目的重大架构变更

2、次版本:表示较大范围的功能增加和变化

3、增量版本:一般表示重大Bug的修复

4、里程碑版本:顾名思义,这往往指某一个版本的里程碑。例如,Maven 3已经发布了很多里程碑版本,如3.0-alpha-1、3.0-alpha-2、3.0-beta-1等,这样的版本与正式的3.0相比,往往表示不是非常稳定,还需要很多测试

关于版本号需要注意的地方

1、不是每个版本号都必须拥有这四个部分,一般来说,主版本和次版本都会声明,但增量版本和里程碑就不一定了

2、当用户在声明依赖或插件未声明版本时,Maven就会根据上述版本号约定自动解析最新版本。这个时候就需要对版本号进行排序,对于主版本、次版本和增量版本来说,比较是基于数字的,因此1.5>1.4>1.3.11>1.3.9。而对于里程碑版本,Maven则只进行简单的字符串比较,因此会得到1.2-beta-3>1.2-beta-11的结果

理解主干、标签与分支

1、主干:项目开发代码的主体,是从项目开始直到当前都处于活动的状态。从这里可以获得项目最新的源代码以及几乎所有的变更历史

2、分支:从主干的某个点分离出来的代码拷贝,通常可以在不影响主干的前提下在这里进行重大Bug的修复,或者做一些实验性质的开发。如果分支达到了预期的目的,通常发生在这里的变更会被合并(merge)到主干中

3、标签:用来标识主干或者分支的某个点的状态,以代表项目的某个稳定状态,这通常就是版本发布时的状态

使用Maven管理项目版本,可能有这样的场景

项目最初的版本是1.0.0-SNAPSHOT,经过一段时间的开发后,1.0.0版本发布,这个时候就需要打一个标签,图中用一个长条表示。然后项目进入1.1.0-SNAPSHOT状态,大量的开发工作都完成在主干中,添加了一些新特性并修复了很多Bug之后。项目1.1.0发布,同样,这时候需要打另一个标签。发布过后,项目进入1.2.0-SNAPSHOT阶段,可这个时候用户报告1.1.0版本有一个重大的Bug,需要尽快修复,我们不能在主干中修Bug,因为主干有太多的变化,无法在短时间内测试完毕并发布,我们也不能停止1.2.0-SNAPSHOT的开发,因此这时候可以基于1.1.0创建一个1.1.1-SNAPSHOT的分支,在这里进行Bug修复,然后为用户发布一个1.1.1增量版本,同时打上标签。当然,还不能忘了把Bug修复涉及的变更合并到1.2.0-SNAPSHOT的额主干中,主干在开发一段时间之后,发布1.2.0版本,然后进入到新版本1.3.0-SNAPSHOT的开发过程中

使用Maven Release Plugin插件,流程化管理版本发布

Maven Release Plugin主要有三个目标,它们分别为:

n         release:prepare,准备版本发布

n         release:rollback,回退release:prepare所执行的操作

n         release:perform,执行版本发布

release:perpare目标都做了哪些操作?

n         检查项目是否有未提交的代码

n         检查项目是否有快照版本依赖

n         根据用户的输入将快照版本升级为发布版

n         将POM中的SCM信息更新为标签地址

n         基于修改后的POM执行Maven构建

n         提交POM变更

n         基于用户输入为代码打标签

n         对代码从发布版升级为新的快照版

n         提交POM变更

release:rollback目标都做了哪些操作?

将POM回退至release:prepare之前的状态,并提交。需要注意的是,该步骤不会删除release:prepare生成的标签,因此用户需要手动删除

release:perform目标都做了哪些操作?

签出release:prepare生成的标签中的源代码,并在此基础上执行mvn deploy命令打包并部署构件至仓库

另外,使用Maven Release Plugin插件需要注意

1、要为项目发布版本,首先需要为其添加正确的版本控制系统信息

2、这是因为Maven Release Plugin需要知道版本控制系统的主干、标签等地址信息后才能执行相关的操作

一般的SCM,版本发布配置SCM信息如下

<project>

...

<scm>

<connection>scm:svn:http://10.1.0.56/app/trunk</connection>

<developerConnection>scm:svn:http://10.1.0.56/app/trunk</developerConnection>

<url>http://10.1.0.56/account/trunk</url>

</scm>
...

</project>

对上面配置进行说明

1、connection元素表示一个只读的scm地址

2、developerConnection元素表示可写的scm地址

3、url表示可以在浏览器中访问的scm地址

4、为了让Maven识别,connection和developerConnection必须以scm开头,冒号之后的部分表示版本控制工具类型(这里是svn),Maven还支持cvs、git等

5、接下来才是实际的scm

地址,该配置中的connection使用了http协议,而developerConnection则由于涉及写操作,使用https协议进行了保护

上面的配置只告诉Maven当前代码的位置(主干),而版本发布还要涉及标签等操作,因此,还需要配置Maven Release Plugin告诉其标签的基础目录

 

配置maven-release-plugin提供标签基础目录

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-release-plugin</artifactId>

<version>2.0</version>

<configuration>

<tagBase>http://10.1.0.56/app/tags/</tagBase>

</configuration>

</plugin>

在执行release:prepare之前还有两个注意点

1、系统必须要提供svn命令行工具,Maven需要svn命令行工具执行相关操作,而无法使用图形化工具,如TortoiseSVN;

2、POM必须配置了可用的部署仓库,因为release:perform会执行deploy操作将构件发布到仓库中

maven-release-plugin提供autoVersionSubmodules参数

使用这个参数,maven-release-plugin会自动为所有子模块使用与父模块一致的发布版本和新的SNAPSHOT版本:

mvn release:prepare -DautoVersionSubmodules=true

如果使用release:prepare命令执行的结果没有问题,就执行mvn release:perform命令

这部分会出现很多问题!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

执行release:perform和release:branch命令以后再试

如何保障构件的安全性

当从中央仓库下载第三方构件的时候,你可能会想要验证这些文件的合法性,例如它们是由开源项目官方发布的,并且没有被篡改过,同样地,当发布自己项目给客户使用的时候,你的客户也会想要验证这些文件是否是由你的项目组发布的,且没有被恶意篡改过PGP (Pretty Good Privacy)就是这样一个用来帮助提高安全性的技术。PGP最常用来给电子邮件进行加密、解密以及提供签名,以提高点子邮件交流的安全性

基于PGP标准的GPG

GnuPG (简称GPG,来自http://www.gnupg.org/) 是PGP标准的一个免费实现,无论是类UNIX平台还是Windows平台,都可以使用它。GPG能够帮助我们为文件生成签名、管理密钥以及验证签名等

具体如何使用GnuPG以后用到再说吧

时间: 2024-08-05 04:44:26

Maven实战读书笔记(14)的相关文章

Maven实战读书笔记(8)

何为Maven的生命周期? 1.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的.易扩展的生命周期 2.这个生命周期包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有的构建步骤 3.Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,实际的任务(如编译源代码)都是交由插件来完成的 Maven的这种思想与设计模式的模板方法非常相似 模板方法模式在父类中定义算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为,这样

Maven实战读书笔记(7)

远程仓库的认证 1.一般来说,远程仓库无须认证就可以访问 2.但有时候出于安全考虑,需要提供认证信息,为了防止非法的仓库访问,管理员为每个仓库提供了一组用户名及密码 3.这时为了让Maven访问仓库内容,就需要配置认证信息 如何配置认证信息? 1.配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中 2.这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机.因此,在settings.x

Maven实战读书笔记(2)

Maven目录分析 通常在安装Maven时,都会设置M2_HOME这个环境变量,M2_HOME指代了Maven的安装目录,下面是目录结构: bin boot lib LICENSE.txt NOTICE.txt README.txt bin目录是? 1.该目录包含了mvn运行的脚本 2.mvn是基于UNIX平台的shell脚本,mvn.bat是基于Windows平台的bat脚本,命令行输入任何一条mvn命令时,实际上时在调用这些脚本,然后执行Java命令,是的maven的运行需要java的环境

Maven实战读书笔记(五):聚合与继承

Maven的聚合特性能够把项目的各个模块聚合在一起构建,而继承特性则能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. 5.1 聚合 Maven聚合也称多模块,能够一次构建多个模块.聚合模块本身是一个Maven项目,所以也有自己的POM文件,该POM文件的packaging为pom,并且含有<modules>和<module>元素,如: <project xmlns="http://maven.apache.org/POM/

Maven实战读书笔记(六):Maven灵活构建

Maven为了支持构建的灵活性,内置了3大特性,即:属性.Profile和资源过滤. 6.1 Maven属性 Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管理并且可以减少日后升级版本的工作量,降低错误发生的概率. 在POM文件中,可以通过${属性名称}的方式来引用属性. 在Maven中,存在6类属性,分别为: 1) 内置属性,主要有两个,分别为:${basedir}表示项目根目录,即POM文件所在的目录.${version}表示项目的版本. 2) PO

Maven实战读书笔记(四):Maven生命周期与插件

Maven的生命周期是对所有构建过程的抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有构建步骤. Maven的生命周期是抽象的,其实际行为是由插件来完成的,生命周期和插件两者协同合作,密不可分. 这种思想与设计模式中的模板方法非常相似.模板方法模式在父类定义算法的整体结构,子类通过实现或者重写父类的方法来控制实际行为,这样既能保证算法有足够的可扩展性,又能严格控制算法的整体结构. 4.1 生命周期 Maven拥有3套独立的生命周期:clean.de

Maven实战读书笔记(15)

关于灵活的构建 一个优秀的构建系统必须足够灵活,它应该能够让项目在不同的环境下都能成功地构建. 例如,典型的项目都会有开发环境.测试环境和产品环境,这些环境的数据库配置不尽相同,那么项目构建的时候就需要能够识别所在的环境并使用正确的配置 还有一种常见的情况是,项目开发了大量的集成测试,这些测试运行起来非常耗时,不适合在每次构建项目的时候都运行,因此需要一种手段能让我们在特定的时候才激活这些集成测试,Maven为了支持构建的灵活性,内置了三大特性,即属性.Profile和资源过滤 Maven属性

Maven实战读书笔记(3)

POM是什么? 1.像Make的Makefile.Ant的build.xml一样,Maven项目的核心是pom.xml 2.POM (Project Object Model, 项目对象模型) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等 如何编写一个Hello World的POM? 新建一个名为pom.xml的文件,输入内容如下: <?xml version="1.0" encoding="UTF-8"?> <project xm

Maven实战读书笔记(13)

WAR 1.基于Java的Web应用,其标准的打包方式是WAR 2.WAR与JAR类似,不过它包含更多的内容,如JSP文件.Servlet.Java类.web.xml配置文件.依赖JAR包.静态web资源(如HTML.CSS.JavaScript文件)等 一个典型的WAR文件的目录结构 - war / + META-INF / + WEB-INF / | + classes / | | + ServletA.class | | + config.properties | | + ... | |