2013-02-27 63 views
3

我在Java中看到了一些关于“循环jar引用”的问题,但我没有看到任何东西。循环jar参考 - 它可以编译?

我的问题是:如何建立两个罐子,其中每个罐子都有方法调用另一个罐子中的类?看起来,每个jar项目中的某些类需要从另一个jar中导入类,因此需要引用构建的类路径中的另一个jar - 但由于相同的原因,其他jar无法编译需要。

我可以理解,将所有类编译为一个大项目,然后将类打包到具有相互依赖关系的独立jar中,但由于需要将其他jar包括在classpath中,因此似乎不可能分别编译每个jar类。

与我的相关性是,我将代码开发成一个jar供另一个项目使用。但是,现在我需要从另一个项目中消费几个API调用。我看到要做到这一点的唯一方法是将一些常用的独立api类分离成第三个项目/ jar,原来的两个项目都可以包含在他们的类路径中。

对此有另一种看法吗?

+3

您需要一些架构师...... ;-)必须避免使用循环引用。 – Aubin 2013-02-27 20:04:03

回答

0

它们不需要在编译时必须作为罐子相互引用。它们可以是两个独立的项目,只要在开发时配置类路径以反映这一点,就可以相互引用。

所以,你可以有一个用例场景,其中:

Api1.Class11 references (or imports) Api2.Class21 

Api2.Class22 references Api1.Class12 

这是合法的,因为虽然在项目级别循环引用,它不是那么在类级别(想象如果两个项目合并成一个并且你有这种情况)。

一旦绑定到jar中,客户端应用程序的责任就是使用它们将两者都包含在类路径中,以便它们可以在运行时以这种方式看到对方。

就我个人而言,我认为这种做法很混乱,但可以做到。为了清楚起见,我不会使用循环引用。

+0

谢谢。这对我来说似乎是鸡和鸡蛋的情况 - 获得至少一个罐子的唯一方法是编译一个项目中的所有类,然后根据需要制作罐子。我同意我不想这样做,这就是为什么我会建议我们在可能的情况下分解第三个罐子,这样所有的罐子都可以在正确订购时独立生成。 – sb4 2013-02-27 20:37:38

+0

如果你喜欢答案,考虑upvoting和接受作为答案 – amphibient 2013-02-27 21:37:28

0

最常见的构建工具无法处理循环依赖关系,但只要至少有一个起始二进制版本的两个jar包,手动增量构建就不能包含循环依赖关系。

由于构建工具无法处理这种依赖关系,实际上很少遇到这种情况,并且被大多数Java开发人员视为糟糕的设计。

+0

谢谢,我会远离它 - 我很欣赏专家的意见。 – sb4 2013-02-27 20:38:38