【发布时间】:2019-08-29 11:05:42
【问题描述】:
当引用简单的 .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();
}
}
将 .jar 文件添加到仅具有文件夹结构 javax/swing(不需要文件)的类路径将导致出现错误。我正在使用 JDK 10/12(均无效)。将编译器合规性设置为1.8 会使整个事情再次工作。
在另一台带有Eclipse 2018-09 的机器上,编译器合规性设置为10。
我在 Eclipse 2019-03 上,在(用于测试目的)新安装的 Eclipse 2018-09 上运行良好。为什么?
编辑 2020 年 6 月(解决方案)
正如答案正确指出的那样,这是 Java 很久以前内置的限制,直到最近才强加给我们。我是在将一个有几十个依赖项的大项目迁移到 Maven 时接触到它的。 2000 年左右就有图书馆了!有“元库”,它由几个打包在一起的库组成。 因此,除了确定仍然需要什么(与其余的一起放入垃圾箱!)、更新违反规则的库或找到它们的替代品外,别无他法。这花了我很多很多小时。
最后它成功了,我们有一个不错的 Maven 项目可以使用。
【问题讨论】:
-
这是Java Platform Module System (JPMS) 的限制,而不是 Eclipse 的限制(所以不要关闭信使)。如果您删除默认包中的文件
module-info.java(禁用 JPMS),它应该可以与 Java 9 或更高版本一起使用。 -
不创建module-info.java时会发生这种情况。
-
我上传了一个视频,显示我在新安装的 2019-03 上遇到的问题:youtu.be/6fQ8ZPprVyo
-
我明白了。解决了将 JRE System Library 从 Modulepath 移动到 Classpath 您的问题吗?
-
所有内容都必须位于类路径、JAR 和 JRE 系统库(视频仅显示 JAR 位于类路径中)。