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

Use SWT in Eclipse in a Java 15 modular setup

我只是想获取基本的 Hello World(项目 Trial0)应用程序 运行 使用:

根据 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 二进制文件和源代码”并下载 zip swt-4.18-gtk-linux-x86_64.zip.
  4. zip 包含 'swt.jar'(其中包含“.so”文件)。启动 Eclipse 的“File > Import > General > Existing Projects into Workspace”,select 上述 zip 为“Archive File”

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

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

在此代码中:

package trial;

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

public class MyApp {

}

这是项目:

注意导入项目中的 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 拉入模块化领域?

根据输出 文件可以看到。

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

requires swt;

这将为您提供对模块 swt(自动模块名称)声称

的包 org.eclipse.swt.widgets 的访问权
contains org.eclipse.swt.widgets

在其描述中。

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

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

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

Name of automatic module 'swt' is unstable, it is derived from the module's file name.

没关系。

以上可能还是不行。在这种情况下,请验证以下内容:

项目 org.eclipse.swt 在导入项目的 Modulepath 上,而不是 Classpath:

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

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