- 浏览: 811623 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (651)
- Java (39)
- Java 初学者小问题 (66)
- 设计模式 (7)
- 项目管理 (3)
- 数据库 (1)
- 算法 (2)
- Java practices (6)
- Effective Java2读书笔记 (78)
- Linux (2)
- programming ruby 读书笔记 (5)
- Core Java Ninth Edition Volume I 读书笔记 (15)
- Pro Git 读书笔记 (12)
- Git (3)
- Maven in Action 读书笔记 (20)
- Web (12)
- 非技术类书籍 (11)
- 电影 (40)
- Web Cache (1)
- jquery (0)
- 历史 (4)
- Dive Into HTML5 读书笔记 (13)
- 三国演义小学毕业考 (79)
- 高效能人士的7个习惯 读书笔记 (12)
- Java Performance 读书笔记 (3)
- Protocol Buffer 学习笔记 (6)
- Mongo DB 学习笔记 (7)
- Morphia 学习笔记 (7)
- Algorithms -- Princeton 学习笔记 (13)
- String研究 (10)
- Hadoop: The Definitive Guide 读书笔记 (3)
- Java与模式读书笔记 (5)
- Date研究 (3)
- The Roman Empire 听课笔记 (4)
- Algorithms -- Standford 学习笔记 (16)
- Core Java Ninth Edition Volume II 读书笔记 (9)
- Thinking in Java 4th Edition 读书笔记 (21)
- Node : Up and Running 学习笔记 (5)
- Eloquent Javascript (8)
- Smashing Node.js 读书笔记 (1)
- Algorithms II -- Standford 学习笔记 (19)
- Algorithm II -- Princeton 学习笔记 (14)
- 网络安全 (2)
- Javascript (4)
- 正则表达式 (1)
- JAVA 7/8 (15)
- JVM (10)
- NodeJS (1)
- 鸟哥的linux私房菜读书笔记 (14)
- Web Service (1)
- The art of programming (9)
- Introduction to Algorithm 读书笔记 (4)
- Java 源码阅读 (0)
- Spring in Action 读书笔记 (2)
- Java Network Programming 读书笔记 (2)
最新评论
-
心存高远:
谢谢作者分享,刚好看到这里不太明白,现在茅塞顿开。不过runt ...
关于 Maven的传递依赖的理解 -
sxlkk:
851228082 写道甚至在某次技术会议现场遇到《Maven ...
关于 Maven的传递依赖的理解 -
851228082:
851228082 写道a----compile----b-- ...
第五章 坐标和依赖 -
851228082:
a----compile----b-----provided- ...
第五章 坐标和依赖 -
851228082:
甚至在某次技术会议现场遇到《Maven in action》的 ...
关于 Maven的传递依赖的理解
1. 版本管理( Version Management )是指项目整体版本的演变过程管理,如从 1.0.0-SNAPSHOT 到 1.0.0 。版本控制( Version Control )是指借助版本控制工具( VCS )追踪代码的每一个变更。
2. 理 想的发布版本应该对应项目某个时刻比较稳定的状态,应满足以下条件:
1) 所有自动化测试应通过
2) 项目没有快照版本的依赖
3) 项目没有配置快照版本的插件
4) 项目包含的代码已全部提交到版本控制系统中。
3. 在 VCS 中使用标签可以明确地将某个源码版本(也就是项目的某个状态)从主干中标记出来,这样在之后的任何时刻,我们都能够快速地得到发布版本的源代码,从而能够比较各个版本的差异,甚至重新构建一个同样版本的构件。
4. 从快照版本更新至发布版本之后,应该再执行一次 Maven 构建,确保项目状态是健康的,再将更新提交到 VCS 的主干中。接着再为当前主干的状态打上标签。
5. Maven 的版本号定义为:
< 主版本 >.< 次版本 >.< 增量版本 >-< 里程碑版本 >
1) 主版本:项目重大架构变更
2) 次版本:较大范围功能变化及 Bug 修复
3) 增量版本:重大 Bug 修复
4) 里程碑版本:一个版本的 milestone ,表示不是非常稳定,还需要很多测试
Maven 对前三者的比较是基于数字的,对里程碑版本只进行简单的字符串比较。
6. VCS中有如下概念:
1) 主干( trunk ):项目开发代码的主体,从项目开始直到当前都处于活动状态,可以获得项目最新源码及所有变更历史。
2) 分支( branch ):从主干的某个点分离出来的代码拷贝,通常是为了在不影响主干的前提下进行重大 Bug 的修复或做些实验性质的开发,当分支达到预期的目的后,分支上的变更会被合并到主干上。如下图中为了不影响 1.2.0 的开发,从 1.1.0 分了一个分支出来进行 Bug 修复。
3) 标签( tag ):用来标识主干或者分支的某个点的状态,以某个稳定状态(通常是版本发布时的状态)
7. Maven Release Plugin 能完成所有版本发布所涉及的操作,它主要有三个目标:
1) release:prepare :准备版本发布,主要执行以下操作:
a) 检查项目是否有未提交代码
b) 检查项目是否有快照版本依赖
c) 根据用户输入将快照版升级为发布版
d) 将 POM 中的 SCM 信息更新为标签地址
e) 基于修改后的 POM 执行 Maven 构建
f) 提交 POM 变更
g) 基于用户输入为代码打标签
h) 将代码从发布版升级为新的快照版
i) 提交 POM 变更
2) release:rollback :回退 release:prepare 所执行的所有操作,提交回退后的 POM ,但不会删除标签
3) release:perform :执行版本发布。签出 release:prepare 生成的标签中的源代码(注意:这里是按标签地址签出原代码, POM 中的版本还是发布版本 ) ,并在此基础上执行 mvn deploy 。
POM 中的 SCM 信息会不会再变到非标签地址 ? (新的快照版本的 scm 地址)还是需要手动自己更新?
8. 可以在 POM 中( project 元素下)配置 SCM 的信息如下:
<scm> <connection>scm:svn:http://192.168.1.103/app/trunk</connection> <developerConnection>scm:svn:https://192.168.1.103/app/trunk</developerConnection> <url>http://192.168.1.103/account/trunk</url > </scm>
connection 元素表示只读的 scm 地址, developerConnection 元素表示可写的 scm 地址,两者必须以 scm 开头,冒号之后表示版本控制工具的类型,接下来才是实际 scm 地址。 url 则表示可在浏览器中访问的 scm 地址。
9. 可以在 POM 中配置 Maven Release Plugin :
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.0</version> <configuration> <tagBase>https://192.168.1.103/app/tags/</tagBase> </configuration> </plugin>
执行 mvn release:prepare ,如果项目有未提交的代码或者有快照版本依赖,则会提示出错。如果一切正确,则会提示用户输入发布版本号、标签名以及新的快照版本号( SVC 命令行工具需要自己安装)。标签地址为 <tagBase> 中的地址加上新的标签名。( https://192.168.1.103/app/tags/app-1.0.0 )
10. 在多模块项目中,如希望所有模块的发布版本和新的快照版本都保持一致,可以设置 -DautoVersionSubmodules=true 参数
11. 在超级 POM 中定义了如下配置:
<profiles> <!-- NOTE: The release profile will be removed from future versions of the super POM --> <profile> <id>release-profile</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <plugins> <plugin> <inherited>true</inherite> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-javadoc-plugin</artifactId> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-deploy-plugin</artifactId> <configuration> <updateReleaseInfo>true</updateReleaseInfo> </configuration> </plugin> </plugins> </build> </profile> </profiles>
这个 profiler 配置了三个插件,分别用来为项目生成 -source.jar ,为项目生成 -javadoc.jar 以及更新仓库中的元数据,告诉仓库该版本是最新的发布版。每个插件中值为 true 的 interited 元素表示该插件配置可以被子 POM 继承。而这个 profile 的激活条件是运行环境中有名为 performRelease 属性且值为 true 。而 release:perform 会自动生成 -DperformRelease=true 参数。由于这种隐式的配置十分令人费解,会在后面版本的 Maven 中去除,让用户自己在 POM 中显示配置这些插件。
12. Maven Release Plugin 的 branch 目标会执行以下操作:
1) 检查本地有无未提交代码
2) 为分支更改 POM 的版本
3) 将 POM 中的 SCM 信息更新为分支地址
4) 提交以上更改
5) 将主干的代码复制到分支中
6) 修改本地代码使其回退到分支之前的版本(用户可以指定新的版本)
7) 提交本地更改
为此我们还需要在 POM 中配置为 Maven Release Plugin 用 <branchBase> 元素配置分支地址。
执行 release:branch –DbranchName=1.1.1 –DupdateBranchVersions=true –DupdateWorkingCopyVersions=false 会提示用户输入新的 branch version 。
最后一个参数表示不更新本地代码(即主干)版本。
13. GnuPG (简称 GPG ,来自 http://www.gnupg.org )是 PGP ( Pretty Good Privacy )标准的一个免费实现,无论类 UNIX 平台还是 Windows 平台都可使用它。 GPG 能帮助我们为文件生成签名、管理密钥以及验证签名等。
14. 使用 gpg –gen-key 生成 GPG 密钥对。使用 gpg –list-keys 可以查看本机的所有公钥。使用 gpg –list-secret-keys 可以查看本机的所有私钥。
15. 使用 gpg –ab temp.java 可以为文件创建一个 ASCII 码的签名文件: temp.java.asc 。 -a 表示生成 ASCII 格式的输出, -b 表示创建一个独立的签名文件。将这两个文件及公钥一起给用户,用户可以用 gpg –verify temp.java.asc 来验证该文件。
16. 运行如下命令可以将公钥发布到公钥服务器中:
gpg –keyserver hkp://pgp.mit.edu –send-keys C6EED57A
这里 C6EED57A 就是用 —list-keys 看到的公钥 ID 。公钥会自动在各个服务器中被同步。
可以用如下命令获得公钥:
gpg –keyserver hkp://pgp.mit.edu –recv-keys C6EED57A
17. 可以在 POM 中配置 Maven GPG Plugin (但命令行 gpg 需要自己安装):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.0</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> <goals> </execution> </executions> </plugin>
用命令行 mvn clean deploy –Dgpg.passphrase=yourpassphrasesk 可以对你发布的构件进行自动签名。 Yourpassphrase 是你的私钥的密码(你在创建私钥的时候可以选择是否设一个密码。)
18. 用如下命令可以对已经发布的构件进行签名:
mvn gpg:sign-add-deploy-file –DpomFile=target/myapp-1.0.pom –Dfile=target/myapp-1.0.jar –Durl=http://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype_oss
该命令指定了要签名的 POM 及相关文件、 Maven 仓库的地址和 ID 。
19. 只有在项目正式发布的时候才需要签名,对日常的 SNAPSHOT 构件签名只会增加耗时。所以可以在 settings.xml 文件中新增一个 profile 来配置 GPG 插件,而 profile 的激活条件同样中 performRelease 为 true 。这样就能在执行 release:perform 时自动执行 GPG 插件了。但由于一个已知的 Maven Release Plugin 的 Bug ,执行 release:perform 过程中签名可能会 hung 住,所以需要为其在 confiuration 元素中增加:
<mavenExecutorId>forked-path</mavenExecutorId>
发表评论
-
关于 Maven的传递依赖的理解
2012-09-30 09:50 14014今天又回顾了一下 《Maven in Action》的读书笔记 ... -
《Maven in Action》读后感
2012-02-23 23:48 2236今天终于读完了《Maven in Action》一书,真所谓书 ... -
第十八章 Archetype
2012-02-23 23:30 51111. Archetype 是 Maven ... -
第十七章 编写Maven插件
2012-02-23 19:42 45141. 编写 Maven 插件的主要步骤 ... -
第十六章 m2eclipse
2012-02-23 15:44 23971. m2eclipse ( http: ... -
第十五章 生成项目站点
2012-02-21 09:27 23081. Maven 社区提供了大量插件,能让用户 ... -
第十四章 灵活的构建
2012-02-20 16:21 18871. 通过 <propertie ... -
第十二章 使用Maven构建Web应用
2012-02-15 18:38 60581. Web 项目的 POM ... -
第十一章 使用Hudson进行持续集成
2012-02-09 17:09 23471. 持续集成就是快速 且高频率 ... -
第十章 使用Maven进行测试
2012-02-05 22:17 214621. com.google.code. ... -
第九章 使用Nexus创建私服
2011-12-06 23:17 108451. Nexus 分为开源版和企业版,开源 ... -
第八章 聚合与继承
2011-12-06 09:55 20701. 为了能用一条命令来构建一个实际 ... -
第七章 生命周期和插件
2011-12-05 13:36 23311. Maven 的生命周期就是为了对所有的构 ... -
第六章 仓库
2011-12-03 18:44 24341. Maven 在一个工作站上的某个位置统一 ... -
第五章 坐标和依赖
2011-12-03 15:14 21041. Maven 定义了这样一组规则:世界上任 ... -
第四章 背景案例
2011-12-02 21:20 14431. 主要场景: 1) 用户访问注册页面 2) ... -
第三章 Maven 使用入门
2011-12-01 18:40 25701. 就像Make的Makefile, Ant的build. ... -
第二章 Maven的安装和配置
2011-12-01 10:01 62551. 设置JAVA_HOME, Path中加入%JAVA_H ... -
第一章 Maven 简介
2011-12-01 09:48 23121. Maven 是优秀的构建工 ...
相关推荐
第13章 电子政务
Oracle数据库安全管理
第13章通常涵盖关系数据库设计,包括ER模型(实体-关系模型)和关系模式的概念。实体代表现实世界中的对象,关系则描述了实体之间的联系。本章可能涉及到关系规范化理论,如第一范式(1NF)、第二范式(2NF)和第三...
安全生产管理知识_第二章第十三节承包商管理_2014年版.doc
财务管理13第十三章国家预算和预算管理.pptx
13第十三章-Linux安全管理.pptx
《Linux服务器配置与管理》教学课件—第 13 章 DNS 服务器配置.pdf《Linux服务器配置与管理》教学课件—第 13 章 DNS 服务器配置.pdf《Linux服务器配置与管理》教学课件—第 13 章 DNS 服务器配置.pdf《Linux服务器...
资料目录.bat 供应链管理(第三版)课件 CHAP-01 第一章 导论.ppt 供应链管理(第三版)课件 CHAP-02 第二章 供应链管理的基本问题.ppt ...供应链管理(第三版)课件 CHAP-12 第十二章 供应链风险管理.ppt
《营销管理》第15版课件—第13章 制定产品战略.ppt 《营销管理》第15版课件—第14章 服务的设计与管理.ppt 《营销管理》第15版课件—第15章 推出新的市场供应物.ppt 《营销管理》第15版课件—第16章 制定定价策略和...
财务管理13第十三章财务报告.pptx
第13章 用户管理 共25页.pptx 第14章 数据备份与还原 共21页.pptx 第15章 MySQL日志 共22页.pptx 第16章 性能优化 共18页.pptx 第17章 MySQL Workbench5.2 的使用 共15页.pptx 第18章 MySQL Replication 共27页.pptx...
第十三章 信息化动态管理.doc
第十三章 逆向物流管理.pptx
第十三章-网络管理.ppt
第十三章城市规划管理.ppt
财务管理学课件第十三章流动资产管理.pptx
第13章 制定产品战略
最后,第十三章至第十六章则聚焦于人力资源管理和变革管理。这一部分内容通常包括招聘策略、员工培训、绩效评估以及员工激励等方面,强调了人力资源作为组织中最宝贵的资源的重要性。同时,变革管理章节将教会学生...
教育学原理基础精讲 第十三章 学校管理.pdf
第13章Linux文件管理,介绍Linux文件系统。