2010-11-16 91 views
2

我在写一个使用javax.script包的OSGI包,并且有一些问题让Felix正确加载包。当试图启动捆绑,我发现了:Felix不喜欢javax.script

失败束开端org.plugin.script.plugin-编剧[2]:org.osgi.framework.BundleException:未解决的约束在束2:封装; (package = javax.script)

我认为当我们试图引用未正确加载到包中的包时会发生这种情况。我相当肯定这是由于javax.script仅从1.6开始捆绑到JDK中,出于某种原因,Maven正在使用其他方法构建。到目前为止,我已经:

a。在我的Maven POM中为Felix设置必要的导入:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <Export-Package>org.plugin.script</Export-Package> 
      <Private-Package>org.plugin.script.*</Private-Package> 
      <Bundle-Activator>org.plugin.script.ScripterPlugin</Bundle-Activator> 
      <Import-Package>!*,javax.script,org.osgi.framework;version="1.3.0",javax.naming,javax.naming.spi</Import-Package> 
      <Embed-Dependency>!org.apache.felix*;scope=compile|runtime;inline=false</Embed-Dependency> 
      <Embed-Transitive>true</Embed-Transitive> 
      <Embed-Directory>dependency</Embed-Directory> 
      <Embed-StripGroup>true</Embed-StripGroup> 
      <_failok>true</_failok> 
     </instructions> 
    </configuration> 
</plugin> 

b。将Maven编译器设置为1.6,因为这是我们得到的最早的javax.script

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.0.2</version> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
    </configuration> 
</plugin> 

c。甚至不知道这是否有所作为,但我将Felix的框架属性(在他们的config.properties中)设置为1.6.0并包含了javax.script导出。 TBH我不确定这个问题,但我认为我会采取一些措施。

org.osgi.framework.system.packages=org.osgi.framework; version=1.3.0, \ 
    [lots of stuff in between] 
    javax.script; \ 
    version="1.6.0" 

还是nadda tho。我还错过了什么?

+0

只是一个随机提示 - 它看起来像你试图加载包时发生的错误,所以你检查你的*执行*平台是Java 1.6吗? – 2010-11-16 23:32:22

+0

@Stephen谢谢你的提示,但那是第一个怀疑。我实际上删除了1.6以外的所有版本,所以我不这么认为。 – Michael 2010-11-17 00:11:22

+0

啊新的发展。清单告诉我,javax.script包在Export-Package(使用:)和Import-Package中,但在Ignore-Package中也是*,这很奇怪,因为我从未将它设置为这样。 – Michael 2010-11-17 01:51:44

回答

0

我会检查以确保一些包正在导出该包。我认为你可以根据你的环境使用像“标题”这样的命令(Felix,Equinox等)。如果你实际上是从的某处出口,那么我会尝试缩小到一个特定的版本。

希望这会有所帮助。

2
<Import-Package>!*,javax.script,org.osgi.framework;version="1.3.0",javax.naming,javax.naming.spi</Import-Package> 

通常你想让bnd导入一个bundle需要的所有东西。这里你告诉它不要输入任何东西(即“!*”)。订单在这里很重要。由于*匹配任何内容,因此您的包不会导入任何内容。尝试彻底删除导入包(这将默认导入所有内容)并查看会发生什么。

+0

谢谢你的提问者。 *实际上已经完成了,所以我可以保持捆绑的大小。想象一下,对我来说,明确说明个人导入会更好,而不是让bnd抓住所有东西,并使罐子变得肥胖。在任何情况下,我仍遇到未解决的约束异常。清单(删除导入包之后)看起来很好tbh: Manifest-Version:1.0 导出包:org.plugin.script;用途:=“javax.script等等” 导入包:javax .script等等 开始减少整体感:P – Michael 2010-11-17 18:53:05

+1

这里有一些有趣的误解。 Import-Package语句对包的大小没有任何影响,它由Private-Package和Export-Package语句控制。Bnd不会“抓住所有东西”......它抓住了你在Java代码中使用的东西,除此之外别无它物。所以通过覆盖!*实际上是说“即使我的代码使用它们,也不要导入这些包”。 – 2010-11-18 00:24:25

+1

至于未解决的约束错误......这仅仅意味着没有其他bundle导出包需要的包。如果你在Java 6上运行,那么“系统包”应该*导出这个包,因为它是Java 6标准库的一部分。如果你运行在Java 5或更早的版本上,那么你需要一个单独的包来导出这个包。 – 2010-11-18 00:49:43