什么是解决Java项目之间依赖关系的最佳方法?

时间:2009-12-18 16:59:08

标签: java dependencies buildpath

我想大多数人都知道,程序员经常会重复使用其他软件的代码。我想,大多数时候这是个好主意。但是,如果您使用其他项目的代码,您的程序将取决于其他项目。

我目前的情况我有三个Java项目A,B和C.现在A使用B和B使用C.我使用eclipse IDE并将B添加到A和C的构建路径到B.的构建路径。有一个编译器错误,A无法从C解析某些东西。所以我必须将C添加到B的构建路径。

那么在保持程序尽可能独立于其他项目的同时解决依赖关系的最佳方法是什么?

我想知道一般情况并参考我目前的情况。有没有更好的方法来做到这一点?即启动/调试配置视图中有类路径设置,但我认为它们在编译时无效。

提前致谢。

8 个答案:

答案 0 :(得分:7)

这听起来像Maven修复的问题集的一部分。使用Maven和Eclipse,即m2eclipse,您可以让项目使用其他项目,并为您处理所有依赖项解析。

答案 1 :(得分:2)

听起来,如果你没有使用像Ivy或Maven这样的依赖管理工具,你可以做你所拥有的,它为你提供了“传递依赖管理”的能力。使用这些工具中的任何一个,您都可以指定A取决于B而B取决于C并且他们将自动知道A也将需要C.

Maven的优势(这是我所经历过的)也会在打包项目进行部署时发挥作用,因为它可以轻松地收集所有这些依赖项(一直到层次结构)并将它们放在一起到分发文件夹或包含所有依赖项的胖JAR。进入像Maven这样的工具需要一些阅读和设置时间,但它确实使管理依赖项的任务变得更加容易,特别是在它们增长时。

答案 2 :(得分:1)

我们使用Maven,这对我们的项目至关重要。这是你学习的好时机 - 对超过3个项目的依赖可能是可怕的。 Maven处理版本,因此如果由于某种原因你必须依赖Foo.1.2.3,那么Maven将确保你没有得到错误的版本。

然而,这不是微不足道的。如果您使用Netbeans,它的内置优于Eclipse,可以帮助您学习。 (此外,两个系统之间的项目也是可以切换的。)

Maven在其POM(pom.xml)文件中支持许多概念,包括许可证信息,贡献者,参数等,因此您获得的不仅仅是依赖关系管理。它支持项目的模块化。

不要跳过学习曲线 - 你需要知道它是如何工作的。但是你也会发现以前提出的SO问题

答案 3 :(得分:1)

其他人提到了一些好的工具,maven可能是最常见的。常春藤是另一个更专注于依赖管理的人。我个人使用gradle,它具有熟悉的groovy包装器中所有这些功能中最好的一些......它仍在不断发展并且经过精心记录。 ;)

要注意的一件事是这些工具如何处理传递依赖性。在你的例子中,C是A的传递依赖,因为A依赖于依赖于C的B。这些构建工具中的一些将以不同的方式处理这种类型的依赖,并且当你最不期望它时它会让你感到惊讶。

例如,如果A实际上引用了来自C的代码,即:它对C具有编译时依赖性,那么您的A-> B-> C设置将在Maven之类的东西中起作用。另一方面,gradle也会让你声明A依赖于C ......因为它确实如此。无论哪种方式都可以完全解决运行时依赖性。

当你在几个月内一直包含某些内容并且你的一些代码依赖于C的各个方面并且你决定不再需要B依赖时,会出现意外。在您发现需要指定A-> C依赖关系之前,您的代码突然不会构建。在这个例子中,发现这很微不足道,但有时却不是。

如果这样说话让你的头脑游了一点,你就不打算让你的项目变得更加复杂......那么你可能只是坚持你正在做的事情一段时间。正如其他人所提到的,如果没有工具帮助你,这是正确的方法。

答案 4 :(得分:1)

使用maven管理依赖项,然后使用依赖项插件查看依赖项。

你可以运行

mvn依赖:分析

mvn依赖:tree -Dverbose = true

这对你有很大的帮助。

答案 5 :(得分:1)

毫无疑问,你应该使用依赖管理工具,正如人们已经注意到的那样......但是,在B_C.jar中归档B和C.测试B在C内的C依赖性。

然后在类路径中添加B_C.jar ...

答案 6 :(得分:0)

依赖管理是一个很大的话题。已经开发了Maven,Ivy和其他工具来缓解疼痛并取得一些成功。这两个工具都创建了一个依赖关系层次结构,因此您不会遇到所描述的情况。他们还有Eclipse插件,以便Eclipse识别该层次结构。

要真正使用这些框架,您必须更改当前的构建过程。 Maven可能需要比Ivy更多的承诺,但两者都不是微不足道的,理解如何设置它需要一些时间。也就是说,明确定义和管理您的依赖项非常有用。

答案 7 :(得分:0)