java - 大型 Java 系统依赖管理

标签 java maven-2 build-process dependencies ivy

我们有一个大型 (>500,000 LOC) Java 系统,它依赖于 40-50 个 OSS 包。系统是用Ant搭建的,依赖管理是 目前人工处理。我正在调查 Ivy 和/或 Maven 自动化依赖。我们将 Maven 视为构建自动化 去年的系统并拒绝了它,因为它需要完全 重构我们的系统以匹配 Maven 的架构。现在我 希望仅自动化依赖管理任务。

我对 Ivy 进行了一些实验,但遇到了问题。 例如,当我将 ActiveMQ 指定为依赖项,并告诉 Ivy 使用 Maven 存储库中的 POM 进行依赖规范,Ivy 检索一堆包(Jetty、Derby 和 Geronimo 用于 实例)我知道不需要只使用 ActiveMQ。

如果我在 ivysettings.xml 中设置 usepoms="false"它只会获取 activemq.jar,但这似乎违背了 Ivy 和 将其降级为具有手动构建依赖项的简单 jar-fetcher 规范。

这里有一个更大的问题,过去被称为“DLL Hell”的东西 window 。在某些情况下,两个直接的第一级依赖项将 指向同一传递依赖的不同版本(对于 实例 log4j.jar)。类路径中只能有一个 log4j.jar,所以 依赖解析涉及手动确定哪个版本是 与我们系统中的所有客户端兼容。

我想这一切都归结为每个包的依赖质量 规范(POM)。在 ActiveMQ 的情况下,没有范围 声明,所以任何对 ActiveMQ 的引用都会下载它的所有 依赖关系,除非我们手动排除我们知道我们不知道的那些 想要。

在 log4j 的情况下,自动依赖解析需要 所有 log4j 的客户端(其他依赖于 log4j 的包) 针对所有先前版本的 log4j 进行验证并提供一个范围(或 POM 中兼容的 log4j 版本列表)。这大概也是 有很多问题要问。

这是目前的情况,还是我遗漏了什么?

最佳答案

你说的很对

I guess it all boils down to the quality of each package's dependency specification (the POM).

我唯一要补充的是查看 POM 或任何其他形式的元数据,作为起点。它非常有用,例如ActiveMQ 为您提供所有依赖项,但您可以自行选择它是否真的适合您的项目。

毕竟,即使考虑到 log4j 版本,您是否有外部依赖项来选择版本或选择您知道适合您的版本?


至于如何选择定制依赖,这里是你可以用 Ivy 做的:

不需要的包

Ivy retrieves a bunch of packages (Jetty, Derby and Geronimo for instance) that I know aren't needed to just use ActiveMQ.

这通常是由于应用程序的模块化程度低造成的。 应用程序的某些部分需要例如 Jetty,但即使你不使用它,你最终也会得到这种传递依赖。

您可能想查看 ivy exclude mechanism :

<dependency name="A" rev="1.0">
  <exclude module="B"/>
</dependency>

依赖版本

Only one log4j.jar can be in the classpath, so dependency resolution involves manually determining which version is compatible with all of its clients in our system.

也许我看错了,但 Ivy 的冲突解决方案中没有 manual 元素。有一个列表default conflict managers :

  • all:此冲突管理器通过选择所有修订来解决冲突。也称为 NoConflictManager,它确实驱逐任何模块。
  • latest-time:此冲突管理器仅选择“最新”修订,最新被定义为最新时间。请注意,最新的时间计算成本很高,所以如果可以的话,最好选择最新的版本。
  • latest-revision:此冲突管理器仅选择“最新”修订,最新由修订的字符串比较定义。
  • latest-compatible:此冲突管理器选择冲突中的最新版本,这可能会导致一组兼容的依赖项。这意味着最终这个冲突管理器不允许任何冲突(如严格冲突管理器),除非它遵循尽力而为的策略来尝试找到一组兼容的模块(根据版本约束);
  • strict:只要发现冲突,此冲突管理器就会抛出异常(即导致构建失败)。

如果需要,您可以provide your own conflict manager .

关于java - 大型 Java 系统依赖管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1456084/

相关文章:

java - 桌面 GUI 工具,用于浏览新的 jar 并将其安装到本地 Maven 仓库

.NET 构建过程

android - 从更改的 framework.jar 构建 Android AOSP system.img

build-process - 如何让 Jenkins 将工件复制到动态目录?

java - Android 应用程序不改变音量

c# - 在java中读取c#二进制文件

java - Cassandra 使用 thrift 在 CQL3 中准备语句

java - 从配置文件解析 Yaml

eclipse - POM 依赖项不起作用(Eclipse、Maven、POM)

java - Maven 不会部署依赖项