【发布时间】:2020-08-15 15:13:12
【问题描述】:
我正在使用 OpenJDK-14 运行 eclipse 4.16。我有一个简单的 java 项目,其中有一个带有 swt.jar 的 lib 文件夹。它被添加到项目的“属性”>“Java 构建路径”>“库”对话框中的模块路径中。当我在我的类中导入和使用一个 swt 类时,系统会提示我在我的模块信息文件中添加一个条目。它添加了带有警告的“swt”:
Name of automatic module 'swt' is unstable, it is derived from the module's file name.
当我尝试将项目作为 java 应用程序运行时,我在控制台中收到此错误并且没有运行:
Error occurred during initialization of boot layer
java.lang.module.FindException: Module swt not found, required by ca.footeware.swt.converter
如果我将项目导出为包含依赖项的可运行 jar,它会出现类似的警告。导出的 jar 确实可以运行(但这不是一个方便的开发周期 :)
我在某处读到,对于非模块化 jar,可以使用 MANIFEST.MF 标头 Automatic-Module-Name。我破解了 swt.jar 并添加了值为 org.eclipse.swt 的标头,即 jar 的根包。我删除了 Requires swt;从我的 module-info.java 中,再次被提示从我的类中添加一个带有 swt 导入的条目。这次虽然进入 Requires org.eclipse.swt;并且没有产生警告。当我尝试运行该项目时,我得到了同样的错误:
Error occurred during initialization of boot layer
java.lang.module.FindException: Module org.eclipse.swt not found, required by ca.footeware.swt.converter
【问题讨论】:
-
"jar with dependencies included" 不能使用模块路径,因为每个模块都必须位于单独的 JAR 中(这是 Java 的限制,而不是 Eclipse 的限制)。不稳定的模块名称警告可以忽略(它只是一个警告),但表明您使用的是过时的 SWT 库版本(较新的版本有
Automatic-Module-Name)。最简单的解决方案是删除您的module-info.java。否则,显示命令行(在运行配置中有一个显示命令行按钮)和你的module-info.java。 -
所以不再有胖罐子了?太糟糕了。
-
Fat JARs 仅在不使用模块路径时(模块的不同
module-info.class文件在 JAR 中相互覆盖,因为它们位于默认包中,即在 JAR 内的根文件夹中)。 -
谢谢@howlger。我的命令行是:/usr/lib/jvm/java-14-openjdk-amd64/bin/java --module-path /home/craig/Downloads/swt.jar;/home/craig/workspace/ca.footeware .converter -Dfile.encoding=UTF-8 -p /home/craig/workspace/ca.footeware.converter/modules:/home/craig/Downloads/swt.jar --limit-modules java.desktop -m ca.footeware .converter/ca.footeware.converter.Converter 我的模块信息是模块 ca.footeware.converter { 出口 ca.footeware.converter.spi;需要 swt; }
-
那个命令行对我来说没有意义:
--module-path和-p; `--limit-modules java.desktop`。请在 Arguments 和 Dependencies 选项卡以及 Project > Properties: Java Build Path 选项卡 Libraries 中显示您的运行配置和模块依赖.