【问题标题】:Accessing SWT Libraries in Java modules in 32/64-Bit JVMs在 32/64 位 JVM 中访问 Java 模块中的 SWT 库
【发布时间】: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


【解决方案1】:

Maven Central 中提供了 32 位和 64 位版本的 SWT 二进制文件。每次发布时,二进制文件都会发布到 Maven Central。

64 位二进制文​​件的链接: https://mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.swt.win32.win32.x86_64 https://mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.swt.cocoa.macosx.x86_64 https://mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.swt.gtk.linux.x86_64

请注意,自 Eclipse 2018-12 (4.10) 版本以来,Eclipse 已放弃对 32 位的支持。

【讨论】:

  • 除了列出的二进制文件之一之外,是否需要将其他文件添加到 POM 文件中?如果我将 64 位二进制文​​件添加到 POM,则无法构建,因为 64 位二进制文​​件本身缺少引用:“无法在 org.eclipse.platform:org.eclipse.swt.win32.win32.x86_64 收集依赖项:jar:3.112.0 -> org.eclipse.platform:org.eclipse.swt:jar:3.105.2 -> org.eclipse.platform:org.eclipse.swt.gtk.linux.aarch64:jar:[3.105. 2,3.105.2]:没有可用于 org.eclipse.platform:org.eclipse.swt.gtk.linux.aarch64:jar:[3.105.2,3.105.2]"的版本
  • @user1628056 在同时使用两者的 OSGi 中,32 位和 64 位 SWT 二进制 JAR 在一个应用程序中的工作方式与使用或不使用 JPMS 的纯 Java 不同。因此,您可以使用 OSGi 而不是普通的 Java,或者自己实现一个组合的 32/64 位 SWT 二进制 JAR(参见 source code)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2011-05-23
  • 2013-09-16
相关资源
最近更新 更多