圆形jar参考 - 可以编译吗?

时间:2013-02-27 20:00:27

标签: java jar compilation circular-reference

我在Java中看到了一些关于“循环jar引用”的问题,我没有看到任何东西。

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

我可以理解将所有类编译为一个大项目,然后将类打包到具有相互依赖性的单独jar中,但由于需要在类路径中包含另一个jar,因此似乎无法单独编译每个jar类。

与我的关系是我将代码开发到jar中供另一个项目使用。但是,现在我需要从其他项目中消耗一些api调用。我认为这样做的唯一方法是将一些常用的和独立的api类分离到第三个项目/ jar中,原始的两个项目都可以包含在它们的类路径中。

还有另一种观点吗?

2 个答案:

答案 0 :(得分:0)

他们不需要在编译时将彼此引用为jar。只要在开发时配置类路径以反映它,它们可以是两个相互引用的独立项目。

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

Api1.Class11 references (or imports) Api2.Class21

Api2.Class22 references Api1.Class12

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

一旦捆绑到jar中,客户端应用程序负责将它们包含在类路径中,以便它们可以在运行时以相同的方式看到彼此。

就个人而言,我认为这种做法令人困惑,但有可能这样做。为了清楚起见,我不会自己使用循环引用。

答案 1 :(得分:0)

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

由于构建工具无法处理这种依赖关系,因此在实践中很少遇到它,并且被大多数Java开发人员认为是糟糕的设计。