我们有一个大型(>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。
这里有一个更大的问题,以前在 Windows 中被称为“DLL Hell”。在某些情况下,两个直接的一级依赖项将指向同一传递依赖项的不同版本(例如 log4j.jar)。类路径中只能有一个 log4j.jar,因此依赖关系解析涉及手动确定哪个版本与我们系统中的所有客户端兼容。
我想这一切都归结为每个包的依赖规范(POM)的质量。在 ActiveMQ 的情况下,没有范围声明,所以任何对 ActiveMQ 的引用都会下载它的所有依赖项,除非我们手动排除我们知道不想要的那些。
在 log4j 的情况下,自动依赖解析将要求 log4j 的所有客户端(依赖于 log4j 的其他包)针对所有先前版本的 log4j 进行验证,并在 POM 中提供兼容 log4j 版本的范围(或列表)。这可能问得太多了。
这是目前的情况,还是我错过了什么?