【发布时间】:2010-11-30 04:13:56
【问题描述】:
我们有一个大型 (>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”的东西 视窗。在某些情况下,两个直接的第一级依赖项将 指向同一传递依赖的不同版本(对于 实例 log4j.jar)。类路径中只能有一个 log4j.jar,所以 依赖解析涉及手动确定哪个版本是 与我们系统中的所有客户端兼容。
我想这一切都归结为每个包的依赖质量 规范(POM)。在 ActiveMQ 的情况下,没有范围 声明,所以任何对 ActiveMQ 的引用都会下载它的所有 依赖关系,除非我们手动排除我们知道我们不知道的那些 想要。
在 log4j 的情况下,自动依赖解析需要 所有 log4j 的客户端(其他依赖于 log4j 的包) 针对所有先前版本的 log4j 进行验证并提供一个范围(或 POM 中兼容的 log4j 版本列表)。这大概也是 有很多问题要问。
这是目前的情况,还是我遗漏了什么?
【问题讨论】:
-
+1 用于清楚地描述问题并尝试解决方案。我希望你能得到一个好的答案。
-
投票率最高的 4 个答案都提供了有价值的观点。凯文的简明准确。罗伯特和里奇提供了更多细节。弗拉基米尔根据现实世界的经验提出了积极的意见。这四个共同帮助我设定了我的期望并为解决问题指明了方向。我想“接受”所有四个答案,但不允许这样做。我接受 Robert Munteanu 是因为他首先给出了详细的答复。
标签: java maven-2 build-process dependencies ivy