我使用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
作为执行环境:
我当然在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>执行环境
偏好设置> Java>编译器:JDK合规性编译器合规级别
当我启动产品时,我检查了使用jre8作为执行环境的启动选项卡。
我甚至尝试更改Java Runtime Environment
对话框中的Run Configurations
:
我尝试了不同的设置。它们都不起作用。
有什么问题?
这是一个已知问题吗?
答案 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
:
使用清单中的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"
此功能从未被提取过。
使用基督徒答案中概述的-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)
修补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
但是,此解决方案需要托管您自己的包含org.eclipse.osgi
软件包的P2存储库,或者将修补程序应用于每个工作区的软件包池。
仍然有可能将BREE保留在#Java; JavaSE-1.7&#34;与现有的org.eclipse.osgi
3.8.2版本兼容。
我目前意识到两个缺点:
据推测,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参数的可能性。
我们采用方法3并成功修补了我们的目标平台,将Java 8与Eclipse 3.8一起使用。
由于我们已经使用所有基于3.8的Eclipse插件维护了我们自己的P2存储库,因此我们需要:
org.eclipse.osgi
的更新副本(也需要从捆绑中删除签名信息)org.eclipse.rcp
功能并使用更新的org.eclipse.osgi
软件包如果您维护自己的P2存储库以提供自定义目标平台而不是使用任何基于Eclipse.org的更新站点,则可以使Eclipse 3.8与Java 8一起使用。
答案 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 ,然后单击“添加所需的插件”。已解决的问题。”
答案 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
如果您像我一样为配置添加一些额外的系统功能,则只会出现此问题。这可以解释为什么有些人会看到这个问题而有些人却没有。
我已经应用了补丁,并且文件管理器再次正常工作。