Java 8&缺少所需能力要求能力:osgi.ee;过滤器= “(及(osgi.ee = JavaSE的)(版本= 1.8))”

时间:2014-07-10 06:36:11

标签: eclipse eclipse-plugin osgi java-8 equinox

我使用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

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

Plug-in Editor. JavaSE-1.8 as Execution Environment

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

 Bundle-RequiredExecutionEnvironment: JavaSE-1.8

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

Validations Dialog, opened from the product file editor

当然,如果我启动产品,我会得到:

!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))".

我试图验证很多:

偏好设置> Java>已安装的JRE

Installed JREs

偏好设置> Java>已安装的JRE>执行环境

Excution Environments

偏好设置> Java>编译器:JDK合规性编译器合规级别

Compiler

当我启动产品时,我检查了使用jre8作为执行环境的启动选项卡。

我甚至尝试更改Java Runtime Environment对话框中的Run Configurations

Java Runtime Environment

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


有什么问题?

这是一个已知问题吗?

8 个答案:

答案 0 :(得分:19)

错误表示您的捆绑包在其清单中有一个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的&#34 ;;版本:列表=" 1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8"

答案 1 :(得分:16)

分享我在改进基于Juno 3.8.2的目标平台上的经验,使用Bundle-RequiredExecutionEnvironment运行JUnit插件测试(" BREE") 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"

此功能从未被提取过。

方法2失败:启动参数

使用基督徒答案中概述的-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捆绑包以包含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

  3. 但是,此解决方案需要托管您自己的包含org.eclipse.osgi软件包的P2存储库,或者将修补程序应用于每个工作区的软件包池。

    讨论

    仍然有可能将BREE保留在#Java; JavaSE-1.7&#34;与现有的org.eclipse.osgi 3.8.2版本兼容。

    我目前意识到两个缺点:

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

    据推测,PDE会评估BREE并相应地设置编译器源级别,然后生成&#34; 1.7&#34;用于Java 8源代码。其他PDE功能(功能导出,产品导出)可能会出现同样的问题。

    使用Eclipse Tycho,可以手动覆盖javac源级别,而不是评估bundle的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.rcp功能并使用更新的org.eclipse.osgi软件包
    • 发布新的基于3.8的P2存储库,供我们的工作站和构建服务器使用。

    摘要

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

    参考文献:Eclipse Bug to support osgi.ee

答案 2 :(得分:3)

我找到了一个可行的配置,没有太多工作。您可以在产品文件,项目设置和构建路径中选择Java 8。重要的是清单文件。在这里,你必须选择Java 8和Java 7.这里的顺序也很重要。 Java 8必须在最重要的位置。

我认为这个配置工作的原因是编译器选择第一个JRE,因此可以处理Java 8的新语法.eclipse包检查其中一个条目是否是所需的Java 7并且也满足。

答案 3 :(得分:3)

一个简单的解决方法是包含org.eclipse.equinox.ds(equinox声明性服务)。该运行时包导出所需的osgi.extender,并且似乎不会触发其他依赖项。

答案 4 :(得分:1)

真实快捷的解决方案:

我编辑了“运行配置”上的“插件”标签,并选中了 org.eclipse.equinox.ds ,然后单击“添加所需的插件”。已解决的问题

https://bugs.eclipse.org/bugs/show_bug.cgi?id=494913#c2

答案 5 :(得分:0)

我在liferay dxp中遇到此错误。我改变了liferay工作区,它工作正常。

答案 6 :(得分:0)

我有同样的问题:缺少必需的能力需要能力:osgi.ee;滤波器=&#34;(及(osgi.ee = JavaSE的)(版本= 1.8))

我正在使用Felix 5.6.10

这是我发现的一件有趣的事: 我创建了两个test.jar包,其中包含以下MANIFEST.MF

test1.jar 清单 - 版本:1.0 Bundle-Description:用于测试的bundle Bundle-SymbolicName:com.phinneyridge.testbundle 捆绑版本:0.0.1 捆绑名称:testbundle Bundle-ManifestVersion:2 需求能力:osgi.ee = JavaSE;版本=&#34; 1.8&#34; 创建者:1.8.0_131(Oracle Corporation)

test2.jar: 清单 - 版本:1.0 Bundle-Description:用于测试的bundle Bundle-SymbolicName:com.phinneyridge.testbundle 捆绑版本:0.0.2 捆绑名称:testbundle Bundle-ManifestVersion:2 要求能力:osgi.ee;过滤器:=&#34;(&amp;(osgi.ee = JavaSE)(版本1.8))&#34; 创建者:1.8.0_131(Oracle Corporation)

正如您所看到的,两个捆绑包仅在Bundle-Version中有所不同,以及如何指定所需的功能。

结果是: test1.jar安装得很好 当您尝试安装时,test2.jar会生成缺少的需求消息。

所以在Require-Capability标头中使用过滤器并不能在我的felix osgi框架中起作用。是否不支持,是否需要配置以启用过滤器?这显然不是因为我的框架没有配置为具有所需的osgi.ee功能(test1.jar可以工作)。

显然,这意味着如果我更正了断层捆绑中的Require-Capability标头,我得到了一个解决方法。 (如果您从开放式存储库安装捆绑包,则不是一个好的解决方案。)

答案 7 :(得分:0)

我在Felix 5.6.10版本中发现导致我的问题的问题:

  

“缺少必需的能力要求能力:osgi.ee; filter =”(&amp;(osgi.ee = JavaSE)(version = 1.8))“

这是产生问题的代码。 它位于ExtensionManager的构造函数

String pkgextra =
        "true".equalsIgnoreCase(configProps.getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ?
            Util.getPropertyWithSubs(configProps, FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA) :
            configProps.getProperty(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA);
    syspkgs = ((pkgextra == null) || (pkgextra.trim().length() == 0))
        ? syspkgs : syspkgs + (pkgextra.trim().startsWith(",") ? pkgextra : "," + pkgextra);

将最后一行更改为:

    syspkgs = ((pkgextra == null) || (pkgextra.trim().length() == 0))
        ? syspkgs : syspkgs + (pkgextra.trim().startsWith(",") ? pkgextra.substring(1) : pkgextra);

它导致问题的原因是我们在构造函数中稍微进一步找到了这段代码:

try
{
    ManifestParser mp = new ManifestParser(
        m_logger, m_configMap, m_systemBundleRevision, m_headerMap);
    List<BundleCapability> caps = aliasSymbolicName(mp.getCapabilities());
    caps.add(buildNativeCapabilites());
    appendCapabilities(caps);
}
catch (Exception ex)
{

如果没有更正,ManifestParser构造函数调用会抛出异常,抱怨导出的功能不能为空。 syspkgs中的额外逗号使得解析器认为缺少某些功能。

一旦你在try块中失败,你就不会将你的主机osgi.ee功能添加到你的框架中,这意味着你不能 解决像(&amp;(osgi.ee = JavaSE)(version = 1.8))

这样的请求

为了清楚起见,这是我所指的具体版本:

org.apache.felix:org.apache.felix.framework:5.6.10

如果您像我一样为配置添加一些额外的系统功能,则只会出现此问题。这可以解释为什么有些人会看到这个问题而有些人却没有。

我已经应用了补丁,并且文件管理器再次正常工作。