分享我对基于 Juno 3.8.2 的目标平台进行改造以使用 Bundle-RequiredExecutionEnvironment ("BREE") JavaSE-1.8 运行 JUnit 插件测试的经验:
方法一失败:片段
在清单中创建带有Provide-Capability 标头的片段到org.eclipse.osgi:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: FrwJava8Support
Bundle-SymbolicName: frwJava8Support
Bundle-Version: 1.0.0.qualifier
Fragment-Host: org.eclipse.osgi;bundle-version="3.8.2"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Provide-Capability: osgi.ee;osgi.ee="JavaSE";version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8"
此功能从未被采用。
方法二失败:启动参数
使用-Dorg.osgi.framework.system.capabilities,如 Christian 的回答中所述。
首先,参数必须正确引用:
-Dorg.osgi.framework.system.capabilities="osgi.ee; osgi.ee=\"JavaSE\";version:List=\"1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\""
这种方法可能适用于pde.junit 以外的任何其他用例。我仍然得到这个(略有不同)异常:
!MESSAGE Bundle com.XXX.tst.frw.common_1.0.0.qualifier [92] was not resolved.
!SUBENTRY 2 com.XXX.tst.frw.common 2 0 2015-04-18 13:43:55.336
!MESSAGE Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.8
!SUBENTRY 1 org.eclipse.osgi 2 0 2015-04-18 13:43:55.336
!MESSAGE Bundle com.XXX.tst.frw.common.test_1.0.0.qualifier [101] was not resolved.
!SUBENTRY 2 com.XXX.tst.frw.common.test 2 0 2015-04-18 13:43:55.336
!MESSAGE Missing host com.XXX.tst.frw.common_1.0.0.
!ENTRY org.eclipse.osgi 4 0 2015-04-18 13:43:55.336
!MESSAGE Application error
!STACK 1
java.lang.IllegalArgumentException: Bundle "com.XXX.tst.frw.common" not found. Possible causes include missing dependencies, too restrictive version ranges, or a non-matching required execution environment.
at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.getClassLoader(RemotePluginTestRunner.java:77)
工作方法 3:Patch Equinox
修补 org.eclipse.osgi 捆绑包以包含 Luna 的 JavaSE-1.8.profile。
将文件<LUNA>\plugins\org.eclipse.osgi_3.10.1.v20140909-1633.jar\JavaSE-1.8.profile 复制到目标平台捆绑池的org.eclipse.osgi 捆绑包。
(例如<myworkspace>\.metadata\.plugins\org.eclipse.pde.core\.bundle_pool\plugins\org.eclipse.osgi_3.8.2.v20130124-134944.jar\JavaSE-1.8.profile)
profile.list 中的参考配置文件(实际上,这似乎是可选的):
将JavaSE-1.8.profile,\ 添加到.metadata\.plugins\org.eclipse.pde.core\.bundle_pool\plugins\org.eclipse.osgi_3.8.2.v20130124-134944.jar\profile.list
但是,此解决方案需要托管您自己的 P2 存储库,其中包含 org.eclipse.osgi 包或将补丁应用到每个工作区的包池。
讨论
仍然有可能将 BREE 保持在与现有 org.eclipse.osgi 3.8.2 版本兼容的“JavaSE-1.7”。
我目前知道两个缺点:
- 如果代码中使用了 Java 8 语法(例如 lambda 表达式),则通过 PDE 直接从 Eclipse 导出插件会失败。
- 日志包含编译器错误,与使用 JavaSE-1.8 BREE 编译的包相比,编译结果的大小实际上不同。
据推测,PDE 评估 BREE 并相应地设置编译器源代码级别,然后导致 Java 8 源代码为“1.7”。其他 PDE 功能(功能导出、产品导出)可能会出现相同的问题。
使用Eclipse Tycho,可以手动覆盖javac 源级别,而不是评估包的BREE(选择要编译的JDK)。然而,Tycho 仍然匹配给定的源代码级别与 BREE 并拒绝编译 Java 8 代码(使用 Tycho 0.22 测试)。
另外,方法 2 很可能不适用于 PDE 的包导出,至少我不知道有任何传递 VM 参数的可能性。
29.05.2015 更新
我们采用方法 3 并成功修补了我们的目标平台以将 Java 8 与 Eclipse 3.8 一起使用。
由于我们已经使用所有基于 3.8 的 Eclipse 插件维护了自己的 P2 存储库,因此我们需要:
- 创建
org.eclipse.osgi 的更新副本(还需要从捆绑包中删除签名信息)
- 创建一个功能补丁,使用更新的
org.eclipse.osgi 捆绑包修补org.eclipse.rcp 功能
- 发布新的基于 3.8 的 P2 存储库,供我们的工作站和构建服务器使用。
总结
如果您维护自己的 P2 存储库以服务于自定义目标平台,而不是使用任何基于 Eclipse.org 的更新站点,则可以使 Eclipse 3.8 与 Java 8 一起使用。
参考:Eclipse Bug to support osgi.ee