在我的当前情况下,我有三个Java项目A、B和C。现在A使用B,B使用C。我正在使用Eclipse IDE,并将B添加到A的构建路径中,将C添加到B的构建路径中。现在出现了编译器错误,A无法解析来自C的某些内容。所以我必须将C添加到B的构建路径中。
那么,在保持您的程序尽可能独立于其他项目的同时解决依赖关系的最佳方法是什么?
我想了解一般情况和与我的当前情况相关的信息。是否有更好的方法来做到这一点?例如,在启动/调试配置视图中有类路径设置,但我认为它们在编译时不起作用。
提前感谢。
这似乎是Maven解决的问题集的一部分。使用Maven和Eclipse,即m2eclipse,您可以使项目使用其他项目,并且所有依赖关系都由系统自动处理。
我们使用Maven,它对我们的项目至关重要。现在是你学习的好时机 - 依赖于超过3个项目可能会让人感到恐惧。 Maven处理版本,因此如果出于任何原因,您必须依赖于Foo.1.2.3,那么Maven将确保您不会得到错误的版本。
然而这并不是微不足道的。如果您使用Netbeans,则内置比Eclipse更好,并且可能会帮助您学习。(两个系统之间的项目也相当可切换)。
Maven在其POM(pom.xml)文件中支持许多概念,包括许可证信息、贡献者、参数等,因此您可以获得比仅依赖管理更多的内容。它还支持项目的模块化。
不要跳过学习曲线 - 您需要知道它的工作原理。但您还将找到以前的SO问题,这将有所帮助。
其他人已经提到了一些好的工具,其中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依赖关系,否则您的代码将无法构建。在这个例子中,这是相当微不足道的,但有时并非如此。
如果这样的话让你有点晕头转向,而且你也不打算让你的项目变得更加复杂...那么你可能只需要继续做你正在做的事情一段时间。正如其他人所提到的,这是正确的方法,没有工具来帮助你。
毫无疑问,正如人们所指出的那样,您应该使用依赖管理工具...手动地将B和C存档在B_C.jar中。测试B对C的依赖是否在Jar中得到解决。
然后将B_C.jar添加到类路径中...
依赖管理是一个重要的主题。已经开发了Maven、Ivy和其他工具来缓解痛苦,取得了一定的成功。这两个工具都创建了依赖层次结构,因此您不会遇到所描述的情况。它们还具有Eclipse插件,以便Eclipse可以识别该层次结构。
要真正使用这些框架,您将不得不改变当前的构建过程。相较而言,Maven可能需要更多的承诺,但Ivy也同样不容易,理解如何设置它需要一些时间。尽管如此,清楚地定义和管理依赖关系非常有帮助。