在 Java 15 模块化设置中在 Eclipse 中使用 SWT

问题描述

我只是想使用以下方法运行基本的 Hello World(项目 Trial0)应用程序:

  • Eclipse 版本:2020-12 (4.18.0)
  • 使用 SWT 4.18(Linux、GTK)
  • Java 编译器设置为 15

按照 Developing SWT applications using Eclipse 中的(有点古老,它是关于 JDK 1.4 和 SWT 3.1)描述,我已将 SWT 项目导入到 Eclipse 中:

  1. 转到https://download.eclipse.org/eclipse/downloads/index.html#Stable_Builds
  2. 点击“4.18”到达https://download.eclipse.org/eclipse/downloads/drops4/R-4.18-202012021800/
  3. 向下滚动直到到达“SWT Binary and Source”并下载 zip swt-4.18-gtk-linux-x86_64.zip
  4. zip 包含“swt.jar”(其中包含“.so”文件)。启动 Eclipse 的“File > Import > General > Existing Projects into Workspace”,选择上面的 zip 作为“Archive File”

我立即在使用导入的 SWT 项目的项目中遇到了模块化/拼图障碍。显然不允许编译器看到未模块化的 SWT 类:

“无法访问包 org.eclipse.swt.widgets”

在这段代码中:

package trial;

import org.eclipse.swt.widgets.*;   // "The package org.eclipse.swt.widgets is not accessible"

public class MyApp {

}

这里是项目:

The package org.eclipse.swt.widgets is not accessible

注意导入项目上的 module-info.java 文件。它包含:

module trial0 {
    requires java.desktop;
}

swt.jar 确实不宣传模块:

$ jar --file=swt.jar --describe-module
No module descriptor found. Derived automatic module.

swt automatic
requires java.base mandated
contains org.eclipse.swt
contains org.eclipse.swt.accessibility
contains org.eclipse.swt.awt
contains org.eclipse.swt.browser
contains org.eclipse.swt.custom
contains org.eclipse.swt.dnd
contains org.eclipse.swt.events
contains org.eclipse.swt.graphics
contains org.eclipse.swt.internal
contains org.eclipse.swt.internal.accessibility.gtk
contains org.eclipse.swt.internal.cairo
contains org.eclipse.swt.internal.dnd.gtk
contains org.eclipse.swt.internal.gtk
contains org.eclipse.swt.internal.image
contains org.eclipse.swt.internal.opengl.glx
contains org.eclipse.swt.internal.webkit
contains org.eclipse.swt.layout
contains org.eclipse.swt.opengl
contains org.eclipse.swt.printing
contains org.eclipse.swt.program
contains org.eclipse.swt.widgets

我是否需要将 module-info.java 文件添加到 SWT jar 中?是否有另一种“规范”的方式将 SWT jar 拉入模块化领域?

解决方法

如您所见,基于输出 describing the module from the jar 文件。

在您的 module-info.java 文件中,您应添加以下指令:

requires swt;

这将为您提供对模块 org.eclipse.swt.widgets(自动模块名称)声称的包 swt 的访问

contains org.eclipse.swt.widgets

在它的描述中。

导入项目的文件 module-info.java 现在包含:

module trial0 {
    requires java.desktop;
    requires swt;
}

Eclipse 将此警告附加到行 requires swt;:

自动模块 'swt' 的名称不稳定,它来源于 模块的文件名。

没关系。

以上可能仍然不起作用。在这种情况下,请验证以下内容:

项目 org.eclipse.swt 位于导入项目的模块路径,而不是类路径

The importing project's module path must look like this

导入的模块需要有访问规则。以下访问规则似乎有效:

Access rule set up in the importing project

请注意,导入项目的“模块依赖项”中没有具体定义:

Trial 0 Module Dependencies

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...