【问题标题】:circular jar reference - can it compile?循环 jar 参考 - 它可以编译吗?
【发布时间】:2013-02-27 20:00:26
【问题描述】:

我在 Java 中看到了一些关于“循环 jar 引用”的问题,但我什么也没看到。

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

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

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

还有其他观点吗?

【问题讨论】:

  • 你需要一些架构师... ;-) 必须避免循环引用。

标签: java jar compilation circular-reference


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我会远离它——我感谢专家的意见。
【解决方案2】:

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

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

Api1.Class11 references (or imports) Api2.Class21

Api2.Class22 references Api1.Class12

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

一旦捆绑到 jars 中,客户端应用程序负责使用它们将两者都包含在类路径中,以便它们在运行时以这种方式相互看到。

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

【讨论】:

  • 谢谢。对我来说,这似乎是先有鸡还是先有蛋的情况——至少构建一个 jar 的唯一方法是编译一个项目中的所有类,然后根据需要制作 jar。我同意我不想这样做,这就是为什么我建议如果可能的话我们将第三个罐子分解出来,这样所有罐子都可以在正确订购时独立构建。
  • 如果您喜欢这个答案,请考虑支持并接受作为答案
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2013-06-05
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多