2014-02-05 144 views
2

我有一个OSGI软件包依赖于通过功能公开的软件包。我依赖的 软件包需要特定版本的软件包,比如com.company.antlr.runtime (3.0.1)。该功能将打包两个版本,即com.company.antlr.runtime (3.0.1)com.company.antlr.runtime (3.2.0)基于Eclipse功能的启动无法解决依赖关系

的问题是,当我提出在Eclipse中基于特征的启动配置与我的包(以一个功能)以及包含我靠包装上的功能,我得到一个丢失的约束 验证错误,指出需要捆绑com.company.antlr.runtime(3.0.1)缺少 。

添加com.company.antlr.runtime (3.0.1)作为捆绑功能启动没有效果,我仍然得到相同的验证错误。

另一方面,如果我进行基于捆绑的启动配置,其中包含与特征中包装的完全相同的 捆绑包,则不存在验证问题。

的问题可以用这个最小的例子来说明:

org.example.examplebundle具有清单:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name:Examplebundle 
Bundle-SymbolicName: org.example.examplebundle 
Bundle-Version:1.0.0.qualifier 
Bundle-RequiredExecutionEnvironment: JavaSE-1.7 
Require-Bundle: com.company.antlr.runtime;bundle-version="[3.0.1,3.0.1]" 

和特征org.example.examplefeature具有feature.xml的:

<feature 
     id="org.example.examplefeature" 
     label="Examplefeature" 
     version="1.0.0.qualifier"> 

    <plugin 
     id="org.eclipse.osgi" 
     download-size="0" 
     install-size="0" 
     version="0.0.0" 
     unpack="false"/> 

    <plugin 
     id="org.example.examplebundle" 
     download-size="0" 
     install-size="0" 
     version="0.0.0" 
     unpack="false"/> 

    <plugin 
     id="com.company.antlr.runtime" 
     download-size="0" 
     install-size="0" 
     version="3.0.1" 
     unpack="false"/> 

    <plugin 
     id="com.company.antlr.runtime" 
     download-size="0" 
     install-size="0" 
     version="3.2.0" 
     unpack="false"/> 

</feature> 

制作仅使用此功能的基于功能的启动将导致验证错误。 使用该功能中包含的四个软件包进行基于软件包的启动不会导致验证错误。

然后,我尝试添加必要的捆绑软件以使用控制台,并从org.example.examplefeature功能中删除软件包org.example.examplebundle,然后使用基于功能的启动运行它。然后我发现捆绑com.company.antlr.runtime (3.0.1)根本没有启动。

如果我将相同的必要捆绑添加到基于捆绑的发布中,我可以观察到com.company.antlr.runtime (3.0.1)com.company.antlr.runtime (3.2.0)都处于活动状态。

我在此基础上的猜测是,基于功能的启动的解析程序得出结论认为,版本号最高的软件包是足够的,因此根本不启动旧版本。

考虑到这一假设,我想在我需要一个完美的匹配 为com.company.antlr.runtime (3.0.1)通过包括在feature.xml下面的代码片段的feature.xml的明确规定:

<requires> 
    <import 
     plugin="com.company.antlr.runtime" 
     version="3.0.1" 
     match="perfect" 
     /> 
    </requires> 

但是,唉,无济于事。

所以,我现在的问题是:有没有办法解决这个问题,同时保持基于功能的启动?

为了完整性:我运行Eclipse 4.3开普勒和OSGi 3.8.1

+0

Rikke,你最终找到解决方案吗? –

+0

不,不是真的。最后,我们必须更新所有内容以使用最新版本的antlr,以便我们不再需要该版本的两个版本。幸运的是,这在合理的时间内是可行的。这可能并非总是如此! –

+0

我在Eclipse中发现了一个错误[产品验证找不到需要两个版本的插件](https://bugs.eclipse.org/bugs/show_bug.cgi?id=367187)并为它提供补丁。它似乎将在下一个版本中得到修复。 –

回答

0

似乎使用的是基于捆绑启动时自动启动设置为true两捆。 使用基于功能的启动程序时,除非已将“默认自动启动”设置为true或创建产品定义并为这些软件包设置启动级别,否则不能这样做。

+0

对于功能和基于捆绑的启动,我都将“默认自动启动”设置为true。你的意思是我应该能够在这种情况下明确地为特征中的捆绑包设置自动启动吗? –

+0

好吧,我有一次这个“默认自动启动”的问题。所以我开始创建产品文件来测试我的基于rcp的功能。您可以在使用该功能时设置包含在功能中的单个捆绑包的起始级别。 .product文件可用于启动equinox(它也将在工作区中创建基于捆绑的启动文件)。 – Cristiano

相关问题