Maven构建依赖项

熟悉发行版和快照依赖项的Maven和Gradle用户可能不了解TeamCity快照依赖项,或者认为他们与Maven相关(这是不正确的)。 熟悉工件和快照依赖关系的TeamCity用户可能不知道,除了TeamCity提供的插件之外,添加Artifactory插件还使他们能够使用工件并建立依赖关系。

上面提到的某些名称似乎建立得不够充分,而其他一些则可能需要讨论其使用方式。 考虑到这一点,我决定在自己的博客文章中探索每种解决方案,并设定了提供足够信息的目标,以便人们可以选择最有效的方法。

第一篇文章探讨了Maven快照和发行版依赖关系。 第二篇文章介绍了TeamCity提供的工件和快照依赖关系,第三篇也是最后一部分将介绍TeamCity Artifactory插件提供的工件和构建依赖关系。

内部和外部依赖性

通过签出整个代码库并从头开始构建应用程序,构建过程可以完全隔离地运行。 对于项目,将相关的二进制依赖项(如果有)与项目源一起保存在VCS中就是这种情况。 但是,在许多其他情况下,构建脚本依赖于某种内部或外部依赖性

内部依赖关系由我们自己的代码来满足,在代码中我们可以完全控制该项目,该项目可以分为多个模块或子项目。 外部依赖关系由其他人的代码(我们无法控制)来满足,我们可以使用它或将其用作客户端。 这可以是第三方库(例如Spring)或另一个团队开发的组件。

这种区别非常重要,因为内部和外部依赖项通常伴随着不同的发布和升级周期:内部依赖项可以每小时进行一次修改,重建和更新,而外部依赖项的发布周期显着变慢,因为用户应用更新的频率更低,如果有的话。 这主要是由于内部依赖项受我们自己控制,并且受到特定项目或模块的限制而产生了范围狭窄的影响,而外部依赖项只能按原样使用,其影响可能是公司或全球范围。 ,它们不受任何项目的限制,可以在任何地方使用。 自然,这需要更高的发行版稳定性,兼容性和成熟度标准,因此发行和更新周期较慢。

“内部与外部”相关性特征的另一方面表现为在构建脚本中如何指定其版本。 内部依赖关系通常使用快照版本定义,而外部依赖关系则使用发行版本。 “快照”“发布”版本的定义是Maven提出的,Maven开创了通过构建工具管理依赖项的想法。 如果您熟悉自动依赖项管理,请随时跳过以下部分,其中提供了有关其工作原理的快速概述。

自动依赖管理

在Maven中,依赖关系是在构建脚本中声明性地指定的,此方法随后是一种较新的构建工具,例如Gradle , Buildr和sbt 。

Maven:

<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>1.8.6</version><scope>compile</scope>
</dependency>

摇篮:

compile "org.codehaus.groovy:groovy-all:1.8.6"

生成器:

compile.with "org.apache.axis2:axis2:jar:1.6.1"

sbt:

libraryDependencies += "org.twitter4j"  % "twitter4j-core"  % "2.2.5"

每个依赖项都通过其坐标范围来标识。 坐标明确指定所使用的库和版本,而范围则定义其在编译或测试调用等构建任务中的可见性和可用性。

例如, "compile org.codehaus.groovy:groovy-all:1.8.6"将为版本"1.8.6"指定一个Groovy "org.codehaus.groovy:groovy-all"发行版,用于源代码编译和测试调用。 将范围切换到“测试”“运行时”将把库的可见性分别缩小到仅测试或仅运行时。

当构建开始时,依赖关系要么位于由构建工具管理的本地工件存储库中(类似于浏览器缓存),要么从远程存储库(无论是公共存储库还是私有存储库)下载,例如Maven Central , Artifactory或Nexus 。 然后,构建工具根据其作用域将解析出的工件添加到相应的类路径中。 组装构建工件(例如"*.war""*.ear"档案时,所有必需的依赖项也会正确处理和打包。

尽管依赖关系管理似乎是几乎所有构建中必不可少的部分,但并非所有构建工具都为其提供内置支持: Ant和MSBuild缺少此功能,后来Ivy和NuGet在一定程度上解决了这一差距。 但是,与Maven相比,Ivy的采用速度较慢,而NuGet是仅.NET的工具。 随着时间的流逝,Maven工件存储库和Maven Central已经成为分布和共享Java工件的事实上的机制。 能够使用Maven存储库解析和部署这些资源已成为所有较新的Java构建工具的“必备”能力。

发行和快照依赖性

如前所述,内部依赖关系通常使用快照版本定义,而外部依赖关系则使用发行版本。 让我们先看一下发行版本,因为它们更容易推论。

发行依赖关系是具有固定版本号的依赖关系 ,例如Groovy发行版的"1.8.6"版本。 无论构建使用什么工件存储库,并且无论何时尝试查找此依赖项,总是希望它解析出完全相同的工件。 这是发布依赖项的主要原理: “相同版本=相同工件” 。 由于这个事实,构建工具不会在发现发布依赖关系更新后对其进行检查,并且仅在清空本地缓存后才会重新下载工件。 当然,所有这一切都是有道理的,因为我们永远都不会期望找到带有相同版本号的同一个库的不同工件!

快照依赖关系是不同的,因此,处理起来很棘手。 快照依赖项版本以特殊的"-SNAPSHOT"关键字结尾,例如"3.2.0-SNAPSHOT" 。 该关键字向构建工具发出信号,以通过远程存储库定期检查工件以进行更新; 默认情况下,Maven 每天执行一次此检查。 快照依赖关系的功能,那么,是依靠别人的工作正在进行中(想想“每日构建”):当产品开发移动从版本"X"到版本"X+1"的模块版本"X+1-SNAPSHOT"

快照相关性不确定性

如果发布依赖关系的主要原则是“相同版本=相同工件” (版本“ X”发布的库,其工件在世界范围内永远相同),则快照依赖关系的原则是“相同版本=不断更新”神器” 。 这种方法的好处是,它可以检索频繁的更新,而无需产生非常不切实际的每日发布。 但是,它的缺点是不确定性–在构建脚本中使用快照依赖关系会使得更难知道在特定构建执行过程中使用了哪个版本。 我的"maven-about-plugin"将文本“ about”文件存储在每个快照工件中,以便更好地标识其来源,例如VCS版本和内部版本号; 这可能会有所帮助,但只能解决一半问题。

作为其定义的移动目标,快照依赖项不允许我们确定我们所依赖的版本,因此很难实现构建的可复制性。 同样,在一系列构建或构建管道中(当完成的构建触发了后续构建的调用时),初始管道步骤所产生的工件不一定会被关闭的那些消耗,因为此后可能会被其他构建过程长时间覆盖,与此同时。

在这种情况下,一种可能的方法是使用时间戳 锁定构建脚本中的依赖项版本,使其成为"3.2.0-20120119.134529-1"而不是"3.2.0-SNAPSHOT" 。 这有效地使快照依赖关系与发行依赖关系相同,并禁用了自动更新机制,从而即使在没有时间戳的情况下也无法使用最新版本,除非更新了时间戳。

如您所见,可以在有意义的地方使用快照依赖关系,但应谨慎并小剂量进行。 如果可能,最好为每个可重用组件管理一个单独的发行生命周期,并让其客户端使用定期更新的发行依赖关系。

摘要

本文概述了Java构建工具对自动依赖项的管理,并介绍了Maven版本和快照依赖项。 它还解释了快照依赖项的优势如何在构建可复制性和构建管道的背景下值得商de。

以下博客文章将探讨TeamCity构建链和Artifactory构建隔离,这些构建隔离允许在整个构建链中使用一致,可重现和最新的快照版本,而无需在构建脚本中锁定其时间戳。 还有更多!

参考:来自Goldman ++博客的JCG合作伙伴 Evgeny Goldin的Maven Build Dependencies 。


翻译自: https://www.javacodegeeks.com/2012/05/maven-build-dependencies.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java两种设计模式_23种设计模式(11)java策略模式

23种设计模式第四篇&#xff1a;java策略模式定义&#xff1a;定义一组算法&#xff0c;将每个算法都封装起来&#xff0c;并且使他们之间可以互换。类型&#xff1a;行为类模式类图&#xff1a;策略模式是对算法的封装&#xff0c;把一系列的算法分别封装到对应的类中&#xf…

Problem E: 平面上的点——Point类 (II)

Description 在数学上&#xff0c;平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定。现在我们封装一个“Point类”来实现平面上的点的操作。 根据“append.cc”&#xff0c;完成Point类的构造方法和show()方法&#xff0c;输出各Point对象的构造和析构次序。 接口描述&a…

MFC 控件RadioButton和CheckBox区别

1. 单个RadioButton在选中后&#xff0c;通过点击无法变为未选中 单个CheckBox在选中后&#xff0c;通过点击可以变为未选中 2. 一组RadioButton&#xff0c;只能同时选中一个 一组CheckBox&#xff0c;能同时选中多个 3. RadioButton在大部分UI框架中默认都以圆形表示 CheckBo…

什么是ActiveMQ?

尽管Active MQ网站已经对ActiveMQ进行了详尽的介绍&#xff0c;但我想在其定义中添加更多上下文。 从ActiveMQ项目的网站上&#xff1a; “ ActiveMQ是JMS 1.1的开源实现&#xff0c;是J2EE 1.4规范的一部分。” 这是我的看法&#xff1a;ActiveMQ是一种开源消息传递软件&…

字符串倒着输出java_Java 输出反转字符串

Java 输出反转字符串public class Test {public static void main(String args[]){try{// 获取键盘输入的字符串BufferReader f new BufferReader(new inputStreamReader(System.in));String str f.readline();for (int i str.length() -1 ; i >0 ; i--) {System.out.p…

webpack基础入门

我相信&#xff0c;有不少的朋友对webpack都有或多或少的了解。网上也有了各种各样的文章&#xff0c;文章内作者也写出了不少自己对于webpack这个工具的理解。在我刚刚接触webpack的时候&#xff0c;老实说&#xff0c;网上大部分的文章我是看不懂的。。webpack里面有很多名词…

位运算基础

异或运算的基础有点忘记了 先介绍一下。。2个数异或 就是对于每一个二进制位进行位运算 具有2个特殊的性质 1、一个数异或本身恒等于0&#xff0c;如5^5恒等于0&#xff1b; 2、一个数异或0恒等于本身&#xff0c;如5^0恒等于5。 3 满足交换律 1.交换数字这个性质能利用与交换数…

JAXB自定义绑定– Java.util.Date / Spring 3序列化

JaxB可以处理Java.util.Date序列化&#xff0c;但是需要以下格式&#xff1a; “ yyyy-MM-ddTHH&#xff1a;mm&#xff1a;ss ”。 如果需要将日期对象格式化为另一种格式怎么办&#xff1f; 我有同样的问题时&#xff0c;我正在同春MVC 3和Jackson JSON处理器 &#xff0c;最…

双足机器人简单步态生成

让机器人行走最简单的方法是先得到一组步态曲线&#xff0c;即腿部每个关节随时间运动的角度值。可以在ADAMS或3D Max、Blender等软件中建立好机构/骨骼模型&#xff0c;设计出脚踝和髋关节的运动曲线&#xff0c;然后进行逆运动学解算&#xff0c;测量每个关节在运动过程中的转…

重新访问了访客模式

访客模式是面向对象设计中最被高估但又被低估的模式之一。 高估了它&#xff0c;因为它常常被选择得太快&#xff08; 可能是由建筑宇航员选择的 &#xff09;&#xff0c;然后以错误的方式添加时会膨胀本来非常简单的设计。 如果您不遵循教科书示例&#xff0c;那么它可能会非…

java web开发技术大_2021年六大javaweb开发主流技术

作为历史最为悠久的编程语言——java&#xff0c;历经数十年依然盘踞在编程榜最前面的位置&#xff0c;这与它的技术和应用范围是分不开的&#xff0c;同时呢&#xff0c;javaweb开发主流技术更是java开发者时时刻刻关注的问题&#xff0c;接下来我们一起分析一下2020年互联网行…

ASP.NET—013:实现带控件的弹出层(弹出框)

http://blog.csdn.net/yysyangyangyangshan/article/details/38458169 在页面中用到弹出新页面的情况比较多的&#xff0c;一般来说都是使用JS方法showModalDialog("新页面相对路径?参数1&参数2",window,"新页面样式");然后会新弹出一个模态的page页。…

运维人员日常工作(转自老男孩)

1&#xff09;运维人员要谨记的6个字&#xff1a; 运维人员做事需遵循&#xff1a;简单、易用、高效 &#xff08;2&#xff09;运维人员服务的3大宗旨&#xff1a; 1、企业数据安全保障。 2、7*24小时业务持续提供服务。 3、不断提升用户感受、体验。 &#xff08;3&#xff0…

c# 操作DatatTable

dtTemp.Columns.Add("列名");//增加一列 dtTemp.Columns.Remove("列名");//删除一列 dtTemp.Columns["旧列名"].ColumnName "新列名";//修改列名 dtTemp.Columns["列名1"].SetOrdinal(dtTemp.Columns["列名2"].O…

java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...

一、权限计算相关分析1.如何存储权限首先说一下权限保存的问题&#xff0c;一个系统中最多有多少权限呢&#xff1f;一个大的系统中可能有成百上千个权限需要管理。怎么保存这么多的权限&#xff1f;首先&#xff0c;我们使用一个数字中的一位保存一种权限&#xff0c;那么如果…

MongoDB性能测试

因此&#xff0c;今天早上&#xff0c;我在mongo shell中四处乱逛。 我想出了三种不同的方式来聚合所需的数据&#xff0c;但不确定随后应移植哪种代码以在应用程序中使用。 那么&#xff0c;我将如何决定实施哪种方法呢&#xff1f; 好吧&#xff0c;让我们选择性能最佳的产品…

$_SERVER[SCRIPT_NAME]、$_SERVER[PHP_SELF]、$_SERVER[QUERY_STRING]、$_SERVER[REQUEST_URI]

1、$_SERVER["SCRIPT_NAME"] 说明&#xff1a;包含当前脚本的路径 2、$_SERVER["PHP_SELF"] 说明&#xff1a;当前正在执行脚本的文件名 3、$_SERVER["QUERY_STRING"] 说明&#xff1a;查询(query)的字符串 4、$_SERVER["REQUEST_URI"…

yii2增删改查及AR的理解

yii2增删改查 // 返回 id 为 1 的客户 $customer Customer::findOne(1); // 返回 id 为 1 且状态为 *active* 的客户 $customer Customer::findOne([ id > 1, status > Customer::STATUS_ACTIVE, ]); // 返回id为1、2、3的一组客户 $customers Customer::findAll([1, …

GWT和HTML5 Canvas演示

这是我对GWT和HTML5 Canvas的第一个实验。 我的第一个尝试是创建矩形&#xff0c;仅用几行代码就得出了这样的内容&#xff1a; 码&#xff1a; public class GwtHtml5 implements EntryPoint {static final String canvasHolderId "canvasholder";static final St…

mysql 平均值 排序_MySQL按平均两个平均值排序

我正在竞赛网站上工作,有两种类型的用户,普通网站成员和评委.每个人都可以使用拖放工具按照他们选择的顺序对特定比赛中的条目进行排序.完成后,相关的条目ID将附加一个排名值,然后可用于确定比赛中哪个条目获得最高的平均分数.获胜者实际上将通过平均每组的平均值来确定.我希望…