2

我有一个依赖于包的 OSGI 包,该包通过功能公开。我依赖的包需要特定版本的包,比如com.company.antlr.runtime (3.0.1). 该功能依次打包了捆绑包的两个版本,com.company.antlr.runtime (3.0.1)以及com.company.antlr.runtime (3.2.0).

问题是,当我在 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.examplebundle从功能中删除包org.example.examplefeature,然后使用基于功能的启动运行它。然后我观察到捆绑包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 Kepler 4.3 和 OSGI 3.8.1

4

1 回答 1

0

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

于 2014-02-06T12:33:55.777 回答