如何将org.eclipse.swt(和其他插件依赖项)添加为自动Java9模块?

时间:2017-12-12 12:49:15

标签: eclipse-plugin swt eclipse-rcp java-9 jigsaw

为了能够将我的Eclipse插件“treezCore”也用作Java9模块,我在src文件夹中创建了一个module-info.java。

此外,我将插件依赖项从Classpath移动到Modulepath。我可以在插件依赖项中看到一个模块“org.eclipse.swt.3.106.1.v20170926”:

enter image description here

但是,我无法在module-info.java中引用该模块。我试过了

require  org.eclipse.swt.3.106.1.v20170926;
require  org.eclipse.swt;
require  swt;

这些选项都没有奏效。 Eclipse使用的jar文件\ plugins \ org.eclipse.swt_3.106.1.v20170926-0519.jar不包含模块定义和

jar --file org.eclipse.swt_3.106.1.v20170926-0519.jar -d

表示无法导出模块描述符。另见

Unable to derive module descriptor for auto generated module names in Java 9?

enter image description here

如果我从

下载更新版本的swt.jar

http://download.eclipse.org/eclipse/downloads/drops4/R-4.7.1a-201710090410/download.php?dropFile=swt-4.7.1a-win32-win32-x86_64.zip

我得到了以下看起来很有希望的输出:

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.gdip
contains org.eclipse.swt.internal.image
contains org.eclipse.swt.internal.mozilla
contains org.eclipse.swt.internal.mozilla.init
contains org.eclipse.swt.internal.ole.win32
contains org.eclipse.swt.internal.opengl.win32
contains org.eclipse.swt.internal.webkit
contains org.eclipse.swt.internal.win32
contains org.eclipse.swt.layout
contains org.eclipse.swt.ole.win32
contains org.eclipse.swt.opengl
contains org.eclipse.swt.printing
contains org.eclipse.swt.program
contains org.eclipse.swt.widgets

我也依赖org.eclipse.jface而无法找到它的单独下载。

=>我是否真的必须等待使用包含模块定义的新插件版本的Eclipse的新版本?

或者我可以以某种方式从插件文件夹中引用旧版本的swt,即使它不包含模块定义?我寻找一种简单的方法来定义别名或后备依赖,例如

requires ../plugins/org.eclipse.swt_3.106.1.v20170926-0519.jar as 'org.eclipse.swt'

requires org.eclipse.swt fallback ../plugins/org.eclipse.swt_3.106.1.v20170926-0519.jar 

但是module-info.java似乎不支持这样的语法。

我有大约20个插件依赖项,并且不想手动下载它们(如果可能的话)并将它们包含为外部jar文件。我也不想破解Eclipse插件文件夹中的各个Manifest / jar文件。我需要更改许多jar文件,Eclipse的更新将打破这种破解。

我正在使用Eclipse for RCP和RAP Developers,版本:Oxygen.1a版本(4.7.1a),Build id:20171005-1200

修改

使用版本:Photon里程碑4(4.8.0M4)构建ID:20171214-1849时,module-info.java中的错误在使用时消失

要求org.eclipse.swt;

并在Modulepath中拥有插件依赖项。

但是,我的导入功能尚未生效,请参阅下图。如果我将插件依赖项从Modulepath移动到Classpath,则导入会起作用,但module-info.java中的错误会重新出现。

我在

创建了一个最小例子

https://github.com/stefaneidelloth/Java9EclipsePluginExample/tree/master/MyPlugin

我在

提交了一份错误报告

https://bugs.eclipse.org/bugs/show_bug.cgi?id=529089

enter image description here

相关问题:

1 个答案:

答案 0 :(得分:7)

您在bug 525660中观察到的内容,首先观察到Eclipse的所有现有(OSGi)工件都不能用作自动模块,因为Java 9无法从jar文件名派生有效的模块名称形状org.eclipse.swt_3.106.1.v20170926-0519.jar

由于要求改进自动模块名称派生算法的发现太晚,因此只能通过在未来版本的清单中添加Automatic-Module-Name标题来解决此问题。

此标题从Photon M4开始,如org.eclipse.swt_3.107.0.v20171205-0742.jar中所示,包含:

  

自动模块名称:org.eclipse.swt