引用简单的 .jar 文件时,Eclipse 会显示一条错误消息:
包 java.awt 可以从多个模块访问:
, java.desktop
例如,当 javax.awt
或 javax.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 许可协议
这是 由
java.awt
也存在于系统库中,但在 Java 平台模块系统 (JPMS) 中,不允许在多个模块中使用同一个包。如果使用模块路径和类路径,则 类 路径 上的所有内容都作为 ---
<unnamed>
模块处理(在您的情况下,包java.awt
存在于系统模块中java.desktop
以及通过模块中 类路径 上的 JAR<unnamed>
)。由于无法将 JRE 系统库 从 模块 路径移动到 _类路径_( 有关详细信息,请参阅 Stephan Herrmann 的回答),您只有以下选项:
java
tojava_util
andjavax
tojavax_util
)并重新创建 JAR.class
文件,您必须先反编译.class
文件