【发布时间】:2020-03-29 14:01:21
【问题描述】:
假设您有一个 Java 模块,它定义了以下对 SWT 的依赖项:
module com.test.mymodule {
requires org.eclipse.swt.win32.win32.x86;
}
如果上面定义的模块在 Windows 中加载到基于 32 位的 JVM 中,则没有问题,但是在 64 位 JVM 中,此操作失败,因为 JVM 尝试在 SWT JAR 中加载本机 32 位库然后导致JVM崩溃。这将发生在引用任何 SWT 类的第一行代码上(例如,如果您调用 Display.getShells)。 Maven 上可用的 JAR 没有在清单中定义 Atomatic-Module-Name 属性,因此尝试添加库的 64-bit version 会导致 Maven 无法正确解析文件名。
Furtmore 在 requires 中添加一个 static 具有完全相同的效果,因为 JVM 坚持加载 module-info 文件中指定的模块。是否有任何通用 SWT 模块可以用来代替系统特定模块,以便无论底层 JVM 的位数/操作系统如何,都可以加载此示例中的 mymodule 模块?
JDK 版本:11.0.2,Windows 10 64 位
【问题讨论】:
-
所有 SWT 模块都特定于 32 位或 64 位以及它们设计的平台。
-
当然他们没有定义任何模块名称,因为他们已经超过五年了。是的,他们加载了 32 位 dll,因为这是 win32 的组件,这意味着 32 位......并且不会在 64 位 jvm 上运行......添加 64 位版本是什么意思?看起来 Central 上没有该库的 64 位版本 .. 最后我会说 SWT 不可能,因为它取决于 JVM (32/64) ...据我所知 JDK 8 是最后一个有 32/64 位版本的版本,其他的只有 64 位版本...
-
同时检查 repo1.maven.org/maven2/org/eclipse/swt 你在这里看不到 64 位版本...
-
@khmarbaise 64 位 SWT 可从 Eclipse 下载站点获得。
-
是的,从 Eclipse 站点下载,但不是限制使用的 Maven 存储库(是的,您可以通过 P2 OSGi 存储库执行操作,但这是另一回事)...
标签: eclipse maven swt 32bit-64bit java-module