maven 构建依赖树_Maven构建依赖项

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>

Gradle:

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工件的事实上的机制。 对于所有较新的Java构建工具而言,能够使用Maven存储库解析和部署这些资源已成为其“必备”功能。

发行和快照依赖性

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

发行依赖关系是具有固定版本号的依赖关系 ,例如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版本和快照依赖项。 它还解释了快照依赖项的优势如何在构建可复制性和构建管道的背景下值得商bat。

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

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


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

maven 构建依赖树

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

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

相关文章

ssh图片上传 java_ssh上传并显示图片

struts部分&#xff1a;attribute"upfileForm"input"/upload/uploadfile.jsp"name"upfileForm"path"/upfile"scope"request"validate"true"type"com.yourcompany.struts.action.UpfileAction">publi…

安卓手机移动端页面为body设置overflow:hidden;不起作用

动态的改变body的样式&#xff0c;测试了可行 var scrollTop $("body").scrollTop();//body设置为fixed之后会飘到顶部&#xff0c;所以要动态计算当前用户所在高度 $("body").css({overflow:hidden,position: fixed,top: scrollTop*-1 }); $loadMask.css…

责任链设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

HDU 5944 Fxx and string(暴力/枚举)

传送门 Fxx and string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 1007 Accepted Submission(s): 422 Description Problem DescriptionYoung theoretical computer scientist Fxx get a string which co…

经典的java程序_Java经典程序

}}}-----------------结果&#xff1a;ABDCBDCB-----------------2.写出程序运行结果import java.lang.StringBuffer;public class Test2{public static void stringReplace(String str){str str.replace(j,i);}public static void bufferReplace(StringBuffer sbf){sbf sbf.…

继续OI

NOIP2016于2016.11.20日12:00正式结束。 我作为oi的生涯 或许会结束&#xff1f; 或者继续&#xff1f; 然而前途依然迷茫&#xff0c;我是否应该继&#xff1f;或是放弃&#xff1f; 距离省选还有3~4个月&#xff0c;我该何去何从&#xff1f; 虽然已经经历过联赛&#xff0c;…

java存储过程示例_安全密码存储–请勿做的事和Java示例

java存储过程示例安全存储密码的重要性 作为软件开发人员&#xff0c;我们最重要的职责之一就是保护用户的个人信息。 如果没有我们应用程序的技术知识&#xff0c;用户别无选择&#xff0c;只能相信我们正在履行这一责任。 令人遗憾的是&#xff0c;在密码方面&#xff0c;软件…

背包问题 贪心算法 java_JS基于贪心算法解决背包问题

前面我们分享了关于js使用贪心算法解决找零问题&#xff0c;本文我们接着为大家介绍JS基于贪心算法解决背包问题。贪心算法&#xff1a;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的仅是在某…

Nginx配置proxy_pass

nginx配置proxy_pass&#xff0c;需要注意转发的路径配置 1、location /test/ { proxy_pass http://t6:8300; } 2、location /test/ { proxy_pass http://t6:8300/; } 上面两种配置&#xff0c;区别只在于proxy_pass转发的路径后是否带 “/” 针对情况1 如果访问url ht…

java代码耗尽内存_有关Java内存溢出及内存消耗的小知识

内存溢出原理&#xff1a;我们知道&#xff0c;Java程序本身是不能直接在计算机上运行的&#xff0c;它需要依赖于硬件基础之上的操作系统和JVM(Java虚拟机)。Java程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度上会影响应用程…

简单一致的Log4j2 Logger命名

在带有Java 7方法句柄的可移植记录器名称一文中 &#xff0c;我写了关于使用Java 7的方法句柄来命名类的记录器的文章。 我在那篇文章中说过&#xff0c;这种方法的优点包括记录器命名的一致性&#xff0c;避免了意外的代码复制和粘贴&#xff0c;这可能会导致将不同的类名用作…

第三周总结 类、对象、包

1.面向对象的特征有哪些&#xff1f;封装、继承、多态、&#xff08;抽象&#xff09;2.一个“.java”文件中是否可以有多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制吗&#xff1f;可以有多个类&#xff0c;但是public的类只有一个&#xff0c;而且必须和j…

java服务器崩溃的原因_请求大神帮忙分析一下服务器崩溃原因

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼---- Minecraft Crash Report ----// Who set us up the TNT?Time: 14-6-11 上午12:52Description: Exception in server tick loopjava.lang.NoClassDefFoundError: scala/collection/Seqat java.lang.Class.forName0(Native Met…

VBA_Excel_教程:过程,函数

Sub s1()Debug.Print "s1"调用过程&#xff1a;无括号&#xff0c;加call提升可读性s2Call s2 End SubSub s2()Debug.Print "s2" End Sub 函数当过程用完全没有问题 Function f1()Debug.Print "f1"f2Call f2 End FunctionFunction f2()Debug.Pri…

java同步方法的特点_java多线程有哪些优点?同步实例代码展示

在我们的日常学习当中会发现java的知识点是总是息息相关的&#xff0c;可以串联起来。java中多线程的有关内容可以衍生出更多知识&#xff0c;它的优缺点也是非常明显的。你都了解吗?一起来看看吧。首先为大家介绍一下&#xff0c;多线程(多个线程同时运行)程序的优缺点优点&a…

使用JUnit规则进行干净的集成测试

JUnit Rules的优势&#xff0c;尤其是在进行集成测试时&#xff0c;几乎不能被高估。 在本文中&#xff0c;我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下&#xff0c;这些简化了灯具控制。 作为示例&#xff0c;我们将看看如何基于…

FreeRTOS--API函数

FreeRTOS--API函数转载于:https://www.cnblogs.com/LittleTiger/p/6128708.html

java fx 内置图标_图标 – 如何在Windows上为javafx本机程序包图标设置自定义图标...

我正在尝试创建exe文件的图标,同时创建javafx包装的本机捆绑.我尝试将图标添加到pom.xml中,但直到它不会为我工作,因为它提供了默认图标使用包含Pom.xml的Intellij IDEA IDE,通过command mvn jfx&#xff1a;build-native创建包这是我的pom.xml&#xff1a;com.zenjavajavafx-…

winform基础窗体设置及基础控件

WinForm - 也叫做C/S 客户端 另&#xff1a;B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点&#xff1a; 不需要联网也可以打开使用部分功能&#xff0c;但是现在的情况是许多功能依然需要互联网的支持&#xff0c;代码部分在用户电脑上执行 使用…

java排序两个数组_java – 如何相对于彼此排序两个数组.

由于这两个值紧密耦合在一起,我实际上会编写一个自定义类来包含信息,然后对这些类进行排序,而不是使用原始数组.这样做会让你对许多可能的错误开放.这样可以更好地控制,数据封装以及将来可能包含哪些方法或数据的扩展.public class MyDistance implements Comparable {private …