我有一个依赖于包的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)
都处于活动状态。
基于此,我的猜测是基于特征的启动的解析器得出的结论是最高的捆绑包 版本号已足够,因此根本不启动旧版本。
考虑到这个假设,我试图在feature.xml中明确说明我需要完美匹配
对于com.company.antlr.runtime (3.0.1)
,请在feature.xml中包含以下代码段:
<requires>
<import
plugin="com.company.antlr.runtime"
version="3.0.1"
match="perfect"
/>
</requires>
但是,唉,无济于事。
所以,我现在的问题是:在保持基于功能的发布的同时,有没有办法解决这个问题?
为了完整性:我正在运行Eclipse Kepler 4.3和OSGI 3.8.1
答案 0 :(得分:0)
在使用基于Bundle的启动器时,似乎您将两个包的自动启动设置为true。 除非已将“默认自动启动”设置为true或创建产品定义并为这些捆绑包设置启动级别,否则在使用基于功能的启动器时无法执行相同的操作。