如何解决Java项目之间的依赖关系?

8
我想大多数人都知道,程序员经常重用其他软件的代码。我认为,大多数情况下这是个好主意。但如果你使用另一个项目的代码,你的程序就依赖于另一个项目。
在我的当前情况下,我有三个Java项目A、B和C。现在A使用B,B使用C。我正在使用Eclipse IDE,并将B添加到A的构建路径中,将C添加到B的构建路径中。现在出现了编译器错误,A无法解析来自C的某些内容。所以我必须将C添加到B的构建路径中。
那么,在保持您的程序尽可能独立于其他项目的同时解决依赖关系的最佳方法是什么?
我想了解一般情况和与我的当前情况相关的信息。是否有更好的方法来做到这一点?例如,在启动/调试配置视图中有类路径设置,但我认为它们在编译时不起作用。
提前感谢。

1
不确定为什么这个问题被踩了,而且还没有评论。这是一个有效的问题,尽管有点偏向新手。这样做不好。 - Dave Sims
8个回答

7

这似乎是Maven解决的问题集的一部分。使用Maven和Eclipse,即m2eclipse,您可以使项目使用其他项目,并且所有依赖关系都由系统自动处理。


1
另外,如果您使用IntelliJ IDEA,内置的Maven集成非常出色。 - danben
2
我们在一个大型项目中使用Maven。一旦设置正确并正常工作,我喜欢它,但是在许多地方文档不够完整,并且它可能具有陡峭的学习曲线。在开始使用之前,请注意这些问题。 - Eric J.
如果您想了解更多关于Maven的内容,可以在sonatype这里免费获取一本电子书:http://www.sonatype.com/Support/Books - Kjellski

2
听起来你没有使用依赖管理工具,例如Ivy或Maven,这些工具提供了“传递性依赖管理”的功能。使用这些工具,您只需指定A依赖于B,B依赖于C,它们就会自动知道A也需要C。
Maven的优点(我有使用经验)在打包项目进行部署时也发挥作用,因为它可以轻松地收集所有这些依赖项(一直到层次结构的底部),并将它们放在一个分发文件夹或包含所有依赖项的fat JAR中。花费一些时间阅读和设置Maven这样的工具,但随着依赖项的增长,它确实使管理依赖项的任务变得更加容易。

1

我们使用Maven,它对我们的项目至关重要。现在是你学习的好时机 - 依赖于超过3个项目可能会让人感到恐惧。 Maven处理版本,因此如果出于任何原因,您必须依赖于Foo.1.2.3,那么Maven将确保您不会得到错误的版本。

然而这并不是微不足道的。如果您使用Netbeans,则内置比Eclipse更好,并且可能会帮助您学习。(两个系统之间的项目也相当可切换)。

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

不要跳过学习曲线 - 您需要知道它的工作原理。但您还将找到以前的SO问题,这将有所帮助。


1

其他人已经提到了一些好的工具,其中Maven可能是最常用的。Ivy是另一个更专注于依赖管理的工具。个人使用gradle,它在熟悉的Groovy包装器下拥有最好的所有这些功能...但该包装器仍在不断发展和零散地记录文档。

需要注意的一件事是这些工具如何处理传递依赖。在您的示例中,C是A的传递性依赖,因为A依赖于B,B依赖于C。其中一些构建工具将以不同方式处理此类依赖关系,并且在您最不希望出现问题时,它们会给您带来惊喜。

例如,如果A实际上引用了C的代码,即:它具有对C的编译时依赖关系,则您的A->B->C设置将在像Maven这样的工具中起作用。另一方面,gradle还将让您声明A依赖于C...因为它确实依赖于C。运行时依赖项可以完全解决。

惊喜来自于当您已经传递包含某个东西数月,并且您的代码已经依赖于C的某些方面,然后您决定不再需要B依赖项。突然间,除非您发现需要指定A->C依赖关系,否则您的代码将无法构建。在这个例子中,这是相当微不足道的,但有时并非如此。

如果这样的话让你有点晕头转向,而且你也不打算让你的项目变得更加复杂...那么你可能只需要继续做你正在做的事情一段时间。正如其他人所提到的,这是正确的方法,没有工具来帮助你。


1
使用Maven来管理您的依赖项,然后使用依赖插件查看这些依赖项。
您可以运行以下命令:
mvn dependency:analyze 或者
mvn dependency:tree -Dverbose=true 这将对您有很大帮助。

1

毫无疑问,正如人们所指出的那样,您应该使用依赖管理工具...手动地将B和C存档在B_C.jar中。测试B对C的依赖是否在Jar中得到解决。

然后将B_C.jar添加到类路径中...


0

依赖管理是一个重要的主题。已经开发了Maven、Ivy和其他工具来缓解痛苦,取得了一定的成功。这两个工具都创建了依赖层次结构,因此您不会遇到所描述的情况。它们还具有Eclipse插件,以便Eclipse可以识别该层次结构。

要真正使用这些框架,您将不得不改变当前的构建过程。相较而言,Maven可能需要更多的承诺,但Ivy也同样不容易,理解如何设置它需要一些时间。尽管如此,清楚地定义和管理依赖关系非常有帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接