【问题标题】:Modules A and B export package some.package to module C in Java 9模块 A 和 B 将包 some.package 导出到 Java 9 中的模块 C
【发布时间】:2018-02-26 20:47:47
【问题描述】:

我有三个模块 module-a、module-b 和 module-c。当我运行我的应用程序时,我得到以下信息:

启动层初始化时出错 java.lang.module.ResolutionException:模块模块-a 和模块-b 将包 some.package 导出到模块 module-c

考虑到module-c不导入some.package是什么意思,如何解决?

【问题讨论】:

  • 所以module-amodule-b 导出同一个包some.package。而且似乎module-c 需要module-amodule-b,即使没有导入包some-package 也是不允许的。你不觉得很理论吗?我认为这是设计失败。虽然export ... to ... 或使用不同的版本可能会有所帮助。
  • Package conflicts with automatic modules in Java 9 的可能重复虽然不是自动模块,但原因似乎与链接的问题重复。

标签: java java-9 java-module


【解决方案1】:

看起来你已经创建了一个split package,这意味着两个模块(在你的例子中是module-amodule-b)包含相同的包(@987654324 @)。模块系统不允许这样做。如果将两个模块都放在module path 上,无论是导出包还是第三个模块依赖于其他两个模块,都会出现此错误。

解决方法是,不要创建共享同一个包的模块。这不仅是一种技术解决方案,它还通过确保每个模块具有特定且独特的 API 来改进设计。

【讨论】:

  • 似乎它阻止了对来自相同包但来自不同 jar 的方法的包级访问。这种方式在图书馆中非常流行,这种限制在 java 9 上打破了它们。
  • 它们在 Java 9 上没有损坏,它们在类路径上运行良好。另一方面,要被视为模块,必须修补这些拆分。
  • 所以我不能在模块路径上使用旧库,对吧?或者我可以同时使用模块和类路径吗?
  • 您可以并行使用模块路径和类路径(参见this answer)。您可以将旧的库放在模块路径上 - 也不能保证它们在那里工作。
  • 我知道我不应该创建不共享同一个包的模块。但是,如果我使用的外部库可能也使用了我使用的其他库,我该如何跟上呢?
猜你喜欢
  • 2020-10-15
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2019-10-08
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多