基于 Eclipse 功能的启动无法解决依赖关系
Posted
技术标签:
【中文标题】基于 Eclipse 功能的启动无法解决依赖关系【英文标题】:Eclipse feature based launch unable to resolve dependency 【发布时间】:2014-03-02 05:49:46 【问题描述】:我有一个依赖于包的 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.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)
都处于活动状态。
我基于此的猜测是基于功能的启动的解析器得出的结论是,具有最高 版本号就足够了,因此根本不会启动旧版本。
考虑到这个假设,我尝试在 feature.xml 中明确声明我需要完美匹配
对于com.company.antlr.runtime (3.0.1)
,在 feature.xml 中包含以下 sn-p:
<requires>
<import
plugin="com.company.antlr.runtime"
version="3.0.1"
match="perfect"
/>
</requires>
但是,唉,无济于事。
所以,我现在的问题是:有没有办法在保持基于功能的启动的同时解决这个问题?
为了完整性:我正在运行 Eclipse Kepler 4.3 和 OSGI 3.8.1
【问题讨论】:
Rikke,你终于找到解决办法了吗? 不,不是。最后,我们不得不更新所有内容以使用最新版本的 antlr,这样我们就不再需要两个版本的捆绑软件了。幸运的是,这在合理的时间内是可行的。情况可能并非总是如此! 我在 Eclipse Product validation doesn't find plugin needed in two versions 中发现了错误并为它提供了补丁。看来下个版本会修复。 【参考方案1】:在使用基于 Bundle 的启动器时,您似乎将两个捆绑包的自动启动设置为 true。 除非您将“默认自动启动”设置为 true 或创建产品定义并为这些捆绑包设置启动级别,否则在使用基于功能的启动器时您不能这样做。
【讨论】:
我将“默认自动启动”设置为 true,用于基于功能和捆绑包的启动。您的意思是在这种情况下我应该能够为功能中的捆绑包明确设置自动启动吗? 好吧,我曾经遇到过这个“默认自动启动”的问题。所以我开始创建产品文件来测试我的基于功能的 rcp。您可以在使用功能时设置包含在功能中的各个捆绑包的起始级别。该 .product 文件可用于启动 Equinox(它也会在工作区中创建一个基于捆绑包的启动文件)。以上是关于基于 Eclipse 功能的启动无法解决依赖关系的主要内容,如果未能解决你的问题,请参考以下文章