为什么我们需要依赖管理的复杂性

时间:2013-03-06 10:00:54

标签: maven sbt dependency-management leiningen buildr

我不确定问题的标题是否正确,但请阅读问题。

在我的大部分工作生涯中(接近11年),我一直在研究C / C ++。我们只有C / C ++源/头文件,所有依赖项都由Makefiles管理。事情既简单又易于管理。

过去1。5年,我已转移到Java域。我感到极度烦恼,处理任何新事物的最困难的方面是依赖管理者。例如maven,leiningen,builder,sbt等等。

每当我从开源世界下载任何新内容时,都需要花费大量时间来设置编译,构建,运行环境。当我使用eclipse时也是如此。为什么不能将所有依赖项与要下载的软件一起放置?为什么像maven,leiningen等工具必须建立一个单独的互联网连接来下载依赖项。我知道maven形成了一个本地存储库,应该能够在本地下载整个互联网时找到依赖关系,但为什么要使用这个模型。我在防火墙后面并不是所有东西都可以访问,而且这些工具无法下载依赖项。我确信大多数工作环境都存在同样的情况。

最近我开始使用clojure,而男孩为了使用clojure配置eclipse很痛苦。 leiningen应该是一些必须与任何clojure开发一起使用的魔法。有时候,学习leiningen比学习clojure概念更重要。我为leiningen下载了所谓的'standalone'jar文件,因为'自行安装'对我不起作用。但是它欺骗了我。一旦我运行'lein'命令它正在建立互联网连接并尝试下载某些东西。为什么?如果没有连接互联网,它甚至不会打印帮助菜单。为什么?如果不绕过我的互联网防火墙,我无法满足其要求,因为我不知道,没有人能告诉我这个人想要的东西。没有其他办法。

每个人似乎都在发明自己的东西。 Java有蚂蚁这很简单,去了Maven,有些项目使用基于Ruby的Builder,Clojure有leiningen,Scala有sbt。 Go还有别的东西。为什么?为什么我们需要在一个已经充满复杂性的世界中增加复杂性。为什么只有一个工具。

所有Java技术专家请原谅我的咆哮。我相信这个问题会被贬低和关闭,就像那些没有努力去理解事情的人一样。但请相信我,我花了足够的时间与这种不必要的复杂性作斗争。

我只是想知道其他人如何解决这个问题,或者我是唯一一个面临这些问题的不幸者。

1 个答案:

答案 0 :(得分:2)

我猜这个问题不能接受答案。我谦卑地可以为你提供元素,希望它们能帮助你对这个问题有所了解。

我认为Java构建系统主要存在两个问题:

  • 其中一些是声明性的,而另一些则使用脚本
  • 用于构建和实施控制的Java工具的碎片化与人员和Java管理空间紧密相关,而不是技术选择。

Maven是以标准方式使用正式语法定义构建的方法的最重要的。您的pom.xml文件不仅仅包含您的构建:它是您的工件,项目元数据,模块和插件所带来的标识。它特别关注依赖项和存储库的声明。 Maven是声明性的。

对于某些程序员来说,这很好,而且他们不经常创建新项目。随着时间的推移它运作良好,它很好地巩固了构建。

Ant是一个不同的系统,您可以在其中定义将按特定顺序链接的任务。所有定义都是使用XML进行的,实际上,您正在编写脚本并声明如何将它们拼接在一起。

Buildr(完全披露:我是那里的提交者)是一个构建系统,它是在处理声明性方法效率低下的挫败感的情况下创建的,其中构建需要执行额外的步骤和复杂的测试以及使用XML进行构建。它是基于脚本的,强制执行约定而不是配置(期望一些好的默认值,但如果你需要更改东西,就让你开车)。

我对Gradle和SBT并不熟悉,但我认为他们从我所听到的内容中扩展和构建了这种方法。

所以这让你希望在构建工具方面更好地了解景观。

没有出现标准构建工具的原因可能与Sun没有推出Java的事实有关。最后,我认为他们采用了Ant(我用它构建了一些大多数JSR jar)。在这个领域也有一些产品可以扩展其中一些构建系统;人们在维护代码而不是支持代码方面付出的代价总是存在巨大差异。

而且,人们争辩说。构建系统是开始火焰战争的好方法。我们很难同意一个标准,尽管一些常见的元素现在已经很好地围绕着Maven工件。

至于需要一遍又一遍地下载互联网,这是一个相当漫长的故事,但这里有一些可能引发不必要下载的事情:

  • 使用SNAPSHOT的任何依赖项都会尝试获取最新的快照。这是一个伟大的计划,但它需要付出代价。您可能依赖于依赖于快照的内容,并因此获得下载。

  • Maven不会重新下载工件,但有时会检查md5。这很容易修复,只需使用命令行中的-O选项。

像Buildr这样的工具是围绕一劳永逸地解决这个问题而建立的。首先,你只下载你说的话。其次,除非您要求,否则不会再次建立连接。默认情况下,Buildr不会播放传递依赖游戏,虽然你可以要求它,但你必须明确地做。

我希望这能提供丰富的信息,而且你在Java领域的旅程将会变得不那么痛苦。