Zulu JDK 11下Eclipse插件中SWT与JavaFX集成问题咨询
我来帮你搞定这个迁移到Java 11后遇到的FXCanvas找不到的问题,结合你的场景(不能嵌入javafx-swt.jar、适配任意带该JAR的JRE),给你几个靠谱的方案:
先理清核心问题
Java 11把JavaFX从JDK中剥离成了模块化组件,原来Java 8里的jfxswt.jar变成了javafx-swt.jar,而且它是一个模块化JAR(包含module-info.class,模块名为javafx.swt)。你之前用--list-modules没看到它,是因为默认情况下JDK不会把lib目录下的JAR加入模块路径,得显式指定路径才能查到。
方案一:通过启动VM参数动态关联JRE中的javafx-swt模块
这是最适配“任意运行环境JRE”的方案,因为它直接利用当前运行JRE的内置资源:
打开Eclipse的Run Configurations,找到你的RCP应用启动配置
切换到Arguments标签页,在VM arguments里添加:
--module-path ${java.home}/lib --add-modules javafx.swt这里的
${java.home}是Eclipse的内置变量,会自动指向当前启动用的JRE路径,不管用户用的是Azul Zulu还是其他带javafx-swt.jar的JRE,都能自动找到对应的库。补充:你可以验证下这个模块是否存在,在命令行里执行
java --list-modules --module-path ${java.home}/lib,就能看到javafx.swt模块了。
方案二:通过插件MANIFEST.MF配置系统级依赖
如果你的插件是模块化项目(有module-info.java),可以通过Eclipse的构建配置把javafx-swt.jar作为系统库依赖,而不是嵌入:
- 右键你的插件项目 → Build Path → Add Libraries → JRE System Library → Edit
- 选择你使用的Azul Zulu JDK 11,然后点击Add External JARs,找到
${java.home}/lib/javafx-swt.jar - 切换到Order and Export标签,确保这个JAR被选中,但不要勾选“Export”(避免打包到插件里)
- 打开
MANIFEST.MF的Runtime标签,把这个JAR添加到Classpath,并设置它的属性为“system”(Eclipse会自动处理运行时的路径映射)
这样配置后,编译时能找到类,运行时会直接从JRE的lib目录加载,不会把JAR嵌入你的插件。
方案三:使用单独下载的OpenJFX SDK替代内置版本
这个方案完全可行,甚至在某些场景下更灵活(比如用户用的JDK没有捆绑JavaFX):
- 从OpenJFX官网下载和JDK 11版本匹配的JavaFX SDK(要对应你的操作系统)
- 在Eclipse里把SDK中的
javafx-swt.jar添加到插件的类路径,但同样不要嵌入 - 在启动配置的VM参数里指定OpenJFX的模块路径:
如果你想让RCP应用部署更方便,可以把OpenJFX的所有必要库打包成一个单独的Eclipse插件,让你的主插件依赖这个插件,这样运行时会自动加载所需的JavaFX组件。--module-path /path/to/openjfx-sdk-11.x/lib --add-modules javafx.swt
关键注意事项
- 绝对不要把
javafx-swt.jar嵌入到你的插件JAR里,这不仅会违反版权协议,还会导致模块化冲突 - 要确保目标运行环境的JRE确实包含
lib/javafx-swt.jar(Azul Zulu的JDK捆绑了这个文件,但Oracle JDK 11之后需要单独安装JavaFX) - 测试时一定要切换不同的JRE验证,确保
${java.home}变量能正确指向对应JRE的lib目录
内容的提问来源于stack exchange,提问作者Mark

