Java 8 & 缺少所需的能力 Require-Capability: osgi.ee;过滤器="(&(osgi.ee=JavaSE)(版本=1.8))"

Posted

技术标签:

【中文标题】Java 8 & 缺少所需的能力 Require-Capability: osgi.ee;过滤器="(&(osgi.ee=JavaSE)(版本=1.8))"【英文标题】:Java 8 & Missing required capability Require-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))" 【发布时间】:2014-08-31 10:31:42 【问题描述】:

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

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

java.runtime.version=1.8.0_05-b13
java.version=1.8.0_05

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

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

 Bundle-RequiredExecutionEnvironment: JavaSE-1.8

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

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

!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

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

Preferences > Java > Compiler:JDK Compliance Compiler 合规级别

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

我什至尝试在Run Configurations 对话框中更改Java Runtime Environment

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


怎么了?

这是一个已知问题吗?

【问题讨论】:

【参考方案1】:

真正快速的解决方案:

"我编辑了运行配置上的插件选项卡并检查了 org.eclipse.equinox.ds 并单击了“添加必需的插件”。已修复.

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

【讨论】:

为我做到了。【参考方案2】:

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

"缺少所需的能力Require-Capability: osgi.ee; filter="(&(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 功能添加到你的框架中,这意味着你不能 解析 (&(osgi.ee=JavaSE)(version=1.8)) 之类的请求

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

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

仅当您像我一样在配置中添加一些额外的系统功能时才会出现此问题。所以这也许可以解释为什么有些人会看到这个问题而其他人却没有。

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

【讨论】:

【参考方案3】:

我有同样的问题:缺少所需的能力 Require-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))

我使用的是 Felix 5.6.10

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

test1.jar 清单版本:1.0 Bundle-Description:用于测试的包 捆绑符号名称:com.phinneyridge.testbundle 捆绑版本:0.0.1 捆绑包名称:testbundle 捆绑清单版本:2 需求能力:osgi.ee=JavaSE;版本=“1.8” 创建者:1.8.0_131(甲骨文公司)

test2.jar: 清单版本:1.0 Bundle-Description:用于测试的包 捆绑符号名称:com.phinneyridge.testbundle 捆绑版本:0.0.2 捆绑包名称:testbundle 捆绑清单版本:2 需求能力:osgi.ee;filter:="(&(osgi.ee=JavaSE)(version 1.8))" 创建者:1.8.0_131(甲骨文公司)

正如您所见,这两个捆绑包仅在 Bundle-Version 以及如何指定所需功能方面有所不同。

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

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

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

【讨论】:

【参考方案4】:

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

对于 osgi.ee 功能,应该由 OSGi 框架(Equinox)提供此功能。显然它没有这样做。

因此,一种方法是从捆绑清单中删除标头。 另一个是让Equinox导出能力。也许您可以简单地尝试使用最新的春分版本。不确定这是否有帮助。 您还可以尝试设置框架属性(使用 -D): org.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"

The same problem on the eclipse list

【讨论】:

谢谢...你说得对,我的目标平台中有一个旧的 Juno Equinox。 我有 Mars.1 Release (4.5.1) Build id: 20150924-1200 并且这个错误仍然出现。起作用的是 Christian 提到的第一个选项:打开 META-INF/MANIFEST.MF 并在“执行环境”下删除 JavaSE-1.8 或用 JavaSE-1.7 替换它,在我导出(“hello world”)应用程序后它开始时没有问题。 Java10 有这个问题。可以在哪里设置框架属性? Eclipse 应用程序的运行配置中的某个位置?【参考方案5】:

我在 liferay dxp 中遇到了这个错误。我已经更改了 liferay 工作区,它工作正常。

【讨论】:

【参考方案6】:

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

【讨论】:

这里 org.eclipse.equinox.ds 依赖于 org.apache.felix.scr。添加后者解决了这个问题。 除了org.eclipse.equinox.ds之外,还得手动添加org.eclipse.equinox.event Add Required Plug-ins 好像坏了:bugs.eclipse.org/bugs/show_bug.cgi?id=494913【参考方案7】:

我找到了一个可以正常工作的配置,没有太多工作。您在产品文件、项目设置和构建路径中选择 Java 8。重要的是清单文件。在这里,您必须同时选择 Java 8 和 Java 7。这里的顺序也很重要。 Java 8 必须处于领先地位。

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

【讨论】:

非常感谢您的提示。我想这可能就是我一直在寻找的答案!【参考方案8】:

分享我对基于 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

    将文件&lt;LUNA&gt;\plugins\org.eclipse.osgi_3.10.1.v20140909-1633.jar\JavaSE-1.8.profile 复制到目标平台捆绑池的org.eclipse.osgi 捆绑包。 (例如&lt;myworkspace&gt;\.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

【讨论】:

对于遗留产品,这比删除所需的标头并希望获得最好的结果或乱搞启动参数要好得多。 感谢您的回答!。我也使用了方法 3,它适用于我们基于 3.8.2 的 RCP 应用程序的命令行 PDE 构建。但是,对我来说,更新 profile.list 文件是强制性的。 一个问题,我们遵循了方法 3,但是现在 PDE 构建无法编译 java 1.8 源代码级别的文件(例如 lambda 表达式)。 PDE 构建属性 javacSource=1.8 和 javacTarget=1.8 的接缝被完全忽略。对此有何建议? 抱歉,我们正在使用 Maven Tycho 进行构建。您是否尝试在 MANIFEST.MF 中将捆绑包的 BREE(捆绑所需执行环境)设置为 1.8? 为我们工作!我上传了一个补丁 3.8.2 osgi lib:github.com/hacki11/osgi-3.8.2-jre1.8

以上是关于Java 8 & 缺少所需的能力 Require-Capability: osgi.ee;过滤器="(&(osgi.ee=JavaSE)(版本=1.8))"的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 8 Streams 从列表中仅获取所需的对象

Flutter App IOS Release Build 错误:缺少所需的图标文件

缺少所需的请求正文

错误:缺少所需的请求正文

该项目缺少构建所需的 Android SDK

缺少平台 android 所需的内容重新安装 xcode