大型 Java 系统依赖关系管理不需要的软件包依赖项版本
我们有一个大型(>500,000 LOC)Java系统,依赖于40-50个OSS包。系统是用Ant构建的,目前依赖关系管理是手动处理的。我正在调查Ivy和/或Maven以自动化依赖关系。我们去年将Maven视为一个构建自动化系统,并拒绝了它,因为它需要完全重组我们的系统以匹配Maven的架构。现在,我希望仅自动执行依赖项管理任务。
我对常春藤做了一些实验,但遇到了问题。例如,当我指定ActiveMQ作为依赖项,并告诉Ivy使用Maven存储库中的POM进行依赖项规范时,Ivy检索了一堆包(例如Jetty,Derby和Geronimo),我知道这些包不需要只使用ActiveMQ。
如果我在ivysettings中设置usepoms=“false.xml它只获取activemq.jar,但这似乎违背了Ivy的目的,并将其降级为一个简单的jar-fetcher,具有手动构建的依赖规范。
这里有一个更大的问题,在Windows中曾经被称为“DLL地狱”。在某些情况下,两个直接的第一级依赖项将指向同一传递依赖项的不同版本(例如 log4j.jar)。类路径中只能有一个 log4j.jar,因此依赖关系解析涉及手动确定哪个版本与我们系统中的所有客户端兼容。
我想这一切都归结为每个包的依赖规范(POM)的质量。在 ActiveMQ 的情况下,没有范围声明,因此对 ActiveMQ 的任何引用都将下载其所有依赖项,除非我们手动排除我们知道不需要的依赖项。
在log4j的情况下,自动依赖关系解析将要求所有log4j的客户端(依赖于log4j的其他软件包)针对所有先前版本的log4j进行验证,并在POM中提供兼容的log4j版本的范围(或列表)。这可能要求太多了。
这是目前的情况,还是我错过了什么?