Java 8&Missing required capability需求能力:osgi.ee; 过滤器= "(&(osgi.ee = JavaSE的)(版本= 1.8))"

Jmi*_*ini 34 eclipse osgi eclipse-plugin equinox java-8

我使用Eclipse Luna win32.x86_64运行Java 8.

这里来自Help Menu > About > Installation Detail > Configuration Tab:

java.runtime.version=1.8.0_05-b13
java.version=1.8.0_05
Run Code Online (Sandbox Code Playgroud)

我创建了新的插件项目,请求JavaSE-1.8作为执行环境:

插件编辑器. JavaSE-1.8作为执行环境

myplugin/META-INF/MANIFEST.MF我的文件当然:

 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Run Code Online (Sandbox Code Playgroud)

我在产品文件中使用此插件.当我尝试验证它时,我收到以下错误:

验证对话框,从产品文件编辑器打开

当然,如果我开始使用该产品,我会得到:

!ENTRY org.eclipse.osgi 2 0 2014-07-10 08:14:22.042
!MESSAGE One or more bundles are not resolved because the following root constraints are not resolved:
!SUBENTRY 1 org.eclipse.osgi 2 0 2014-07-10 08:14:22.043
!MESSAGE Bundle update@********/myplugin/ was not resolved.
!SUBENTRY 2 myplugin 2 0 2014-07-10 08:14:22.044
!MESSAGE Missing required capability Require-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))".
Run Code Online (Sandbox Code Playgroud)

我试过验证了很多:

首选项> Java>已安装的JRE

已安装的JRE

首选项> Java>已安装的JRE>执行环境

执行环境

首选项> Java>编译器:JDK合规性编译器合规性级别

编译器

当我启动产品时,我在Launching选项卡中检查了我使用jre8作为执行环境.

我甚至试图改变Java Runtime EnvironmentRun Configurations对话框:

Java运行时环境

我尝试了不同的设置.它们都不起作用.


怎么了?

这是一个已知的问题吗?

Chr*_*der 22

该错误意味着您的捆绑包Require-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))"在其清单中有一个条目.所以这意味着捆绑包只会在有一个提供此功能的捆绑包时启动.

在osgi.ee功能的情况下,应该提供此功能的OSGi框架(equinox).显然它没有这样做.

因此,一种方法是从捆绑Manifest中删除标头.另一种方法是使昼夜平分点出口能力.也许您可以尝试使用最新的昼夜平分点版本.不确定这是否有帮助.您也可以尝试设置框架属性(使用-D):org.osgi.framework.system.capabilities = osgi.ee; osgi.ee = "JavaSE的";版本:列表= "1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8"

看到

  • 我在使用 Java10 时遇到了这个问题。框架属性在哪里可以设置?Eclipse 应用程序的运行配置中的某个位置? (2认同)

小智 19

分享我基于Juno 3.8.2改造目标平台的经验,用Bundle-RequiredExecutionEnvironment("BREE")运行JUnit插件测试JavaSE-1.8:

方法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"
Run Code Online (Sandbox Code Playgroud)

这种能力从未被提升过.

方法2失败:启动参数

使用-Dorg.osgi.framework.system.capabilitiesChristian的回答中概述的内容.

首先,必须正确引用该论点:

-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\""
Run Code Online (Sandbox Code Playgroud)

这种方法可能适用于除了以外的任何其他用例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)
Run Code Online (Sandbox Code Playgroud)

工作方法3:补丁Equinox

修补org.eclipse.osgi捆绑包括Luna的JavaSE-1.8.profile.

  1. 将文件复制<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)

  2. 参考配置文件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

但是,此解决方案需要托管您自己的包含org.eclipse.osgi捆绑包的P2存储库,或者将补丁应用于每个工作区的捆绑池.

讨论

仍然有可能将BREE保持在与现有org.eclipse.osgi3.8.2版本兼容的"JavaSE-1.7" .

我目前意识到两个缺点:

  • 如果在代码中使用Java 8语法(例如lambda表达式),则通过PDE直接从Eclipse导出插件失败.
  • Log包含编译器错误,与使用JavaSE-1.8 BREE编译的bundle相比,编译结果实际上具有不同的大小.

据推测,PDE会评估BREE并相应地设置编译器源级别,然后为Java 8源生成"1.7".其他PDE功能(功能导出,产品导出)可能会出现同样的问题.

使用Eclipse Tycho,可以手动覆盖javac源代码级别,而不是评估bundle的BREE(选择要编译的JDK).但是,Tycho仍然匹配给定的源级别与BREE,并拒绝编译Java 8代码(使用Tycho 0.22测试).

此外,方法2很可能不适用于PDE的bundle导出,至少我不知道有任何传递VM参数的可能性.

2015年5月29日更新

我们采用方法3并成功修补了我们的目标平台,将Java 8与Eclipse 3.8一起使用.

由于我们已经使用所有基于3.8的Eclipse插件维护自己的P2存储库,因此我们需要:

  • 创建一个更新的副本org.eclipse.osgi(需要从bundle中剥离签名信息)
  • 创建功能补丁,org.eclipse.rcp使用更新的org.eclipse.osgi捆绑包修补功能
  • 发布新的基于3.8的P2存储库,供我们的工作站和构建服务器使用.

摘要

如果您维护自己的P2存储库以提供自定义目标平台而不是使用任何基于Eclipse.org的更新站点,则可以使Eclipse 3.8与Java 8一起使用.

参考资料:Eclipse Bug支持osgi.ee