分享我的经验,将基于Juno 3.8.2的目标平台改造成可以使用Bundle-RequiredExecutionEnvironment(“BREE”)JavaSE-1.8运行JUnit插件测试。
失败的方法1:片段
创建一个片段到org.eclipse.osgi,并在清单中使用Provide-Capability头。
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"
这个能力从未被使用。
失败的方法2:启动参数
使用Christian的答案中概述的-Dorg.osgi.framework.system.capabilities
。
首先,必须正确引用该参数:
-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:修补Equinox
将org.eclipse.osgi
bundle进行修补,以包括Luna的JavaSE-1.8.profile
。
将文件<LUNA>\plugins\org.eclipse.osgi_3.10.1.v20140909-1633.jar\JavaSE-1.8.profile
复制到目标平台bundle池中的org.eclipse.osgi
bundle中。
(例如:<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
中引用profile(实际上,这似乎是可选的):
将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"的可能性。
我目前知道两个缺点:
通过PDE直接从Eclipse导出插件,如果代码中使用了Java 8语法(例如lambda表达式),则会失败。
日志包含编译器错误,并且编译结果实际上与使用JavaSE-1.8 BREE编译的捆绑包大小不同。
据推测,PDE评估BREE并相应地设置编译器源级别,这将导致Java 8源的"1.7"。其他PDE功能(特性导出、产品导出)可能会出现同样的问题。
使用Eclipse Tycho,可以手动覆盖javac源级别,而不是评估包的BREE(选择要编译的JDK)。然而,Tycho仍会匹配给定的源级别与BREE,并拒绝编译Java 8代码(使用Tycho 0.22进行测试)。
此外,第二种方法很可能无法与PDE的捆绑包导出一起使用,至少我不知道有任何传递VM参数的可能性。
2015年5月29日更新
我们采用了第三种方法,成功地修补了我们的目标平台,使其与Eclipse 3.8一起使用Java 8。
由于我们已经维护了自己的带有所有基于3.8的Eclipse插件的P2存储库,因此我们需要:
- 创建一个更新的
org.eclipse.osgi
副本(还需要从bundle中去掉签名信息)
- 创建一个功能补丁,使用更新的
org.eclipse.osgi
bundle来修补org.eclipse.rcp
功能
- 发布新的基于3.8的P2存储库,供我们的工作站和构建服务器使用。
摘要
如果您维护自己的P2仓库来为自定义目标平台提供服务,而不是使用任何基于Eclipse.org的更新站点,则可以使Eclipse 3.8与Java 8配合使用。
参考文献:
Eclipse Bug to support osgi.ee