Eclipse 被导入混淆(“可从多个模块访问”)

新手上路,请多包涵

引用简单的 .jar 文件时,Eclipse 会显示一条错误消息:

包 java.awt 可以从多个模块访问:, java.desktop

例如,当 javax.awtjavax.swing 包含在 .jar 文件中时,就会发生这种情况。

最简单的例子如下:

 package test;

import javax.swing.JDialog;

public class Test {
    public static void main(String[] args) {
        new JDialog();
    }
}

将仅具有文件夹结构 javax/swing (不需要文件)的 .jar 文件添加到类路径将导致出现错误。我正在使用 JDK 10/12(均无效)。将编译器合规性设置为 1.8 使整个事情再次运行。在另一台机器上 Eclipse 2018-09 这适用于编译器合规性设置为 10

我在 Eclipse 2019-03 上,在(用于测试目的)新安装的 Eclipse 2018-09 上工作正常。为什么?

编辑 2020 年 6 月(解决方案)

正如正确回答的那样,这是很久以前 Java 中内置的限制,直到最近才强加给我们。我是在把一个有几十个依赖的大项目迁移到Maven的时候接触到它的。 2000 年左右就有图书馆了!有“元库”,由几个打包在一起的库组成。因此,除了确定仍然需要什么(与其余部分一起扔进垃圾桶!)、更新违反规则的库或找到它们的替代品之外,别无他法。这花了我很多很多小时。

最后它成功了,我们有一个很好的 Maven 项目可以使用。

原文由 Krann Sock 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 430
2 个回答

这是

  • 类路径 上的一个 JAR, 其中包含 java.awt 也存在于系统库中,但
  • JRE 系统库 Modulepath

Java 平台模块系统 (JPMS) 中,不允许在多个模块中使用同一个包。如果使用模块路径和类路径,则 路径 上的所有内容都作为 --- <unnamed> 模块处理(在您的情况下,包 java.awt 存在于系统模块中 java.desktop 以及通过模块中 类路径 上的 JAR <unnamed> )。

由于无法将 JRE 系统库模块 路径移动到 _类路径_( 有关详细信息,请参阅 Stephan Herrmann 的回答),您只有以下选项:

  • 将编译器合规性设置为 1.8(正如您已经提到的)
  • 重建 JAR避免 JAR 中包含 Java 系统库包名称(如果使用反射,可能需要进行额外的代码更改):
    • If you have the source code, change the package names (eg change the package and subpackae java to java_util and javax to javax_util )并重新创建 JAR
    • 如果您只有 .class 文件,您必须先反编译 .class 文件

原文由 howlger 发布,翻译遵循 CC BY-SA 4.0 许可协议

因为我敢打赌很多人会遇到模块化 Java 的这个问题,所以我会提供帮助并给出真正的答案。

这个错误发生在

  • 你对你的项目有依赖
  • 包含代码
  • 使用包
  • 也在模块中
  • 被你的项目引用

如果您的项目已将源兼容性设置为 Java 12 之类的东西,它将开始执行 Java 中一直存在的规则:

“不要在你自己的代码中使用属于 JDK 的包。”

不幸的是,多年来,许多开发人员和供应商都这样做了。不能再那样做了。

如果您将项目设置为 Java 12 源兼容性,Eclipse 会添加 JDK 模块,其中包括所有“java.*”和“javax.*”甚至“jdk.*”、“org.w3c.*”。这些包可能正在被您的依赖项或其传递依赖项使用。

怎么修

你需要:

  • 看看它抱怨的是哪个包裹
  • 并在 Package Explorer 中展开 “Projects and External Dependencies” 节点。
  • 找出哪个依赖项正在使用该包。
  • 然后您可以简单地从您的项目中排除该依赖项。

或者您可以获得该依赖项的源代码(如果可用),并使用更改后的包重建 jar。否则,您必须删除该依赖项并找到该技术的替代品。痛吧?

如果它是一个传递依赖,你通常可以将它排除在外。这是基于 Gradle 的项目的示例。

摇篮配置文件

 configurations {
   all*.exclude group: 'xml-apis'
}

原文由 K. Taylor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题