费利克斯没有';我不喜欢javax.script

费利克斯没有';我不喜欢javax.script,java,osgi,javax.script,apache-felix,Java,Osgi,Javax.script,Apache Felix,我正在使用javax.script包编写一个OSGI包,在让Felix正确加载包时遇到了一些问题。尝试启动捆绑包时,我得到: org.plugin.script.plugin-scripter[2]的捆绑启动失败:org.osgi.framework.BundleException:捆绑包2中未解决的约束:包;(package=javax.script) 我认为当我们试图引用一个没有正确加载到包中的包时会发生这种情况。我相当肯定这是因为javax.script只从1.6开始捆绑到JDK中,出于某

我正在使用javax.script包编写一个OSGI包,在让Felix正确加载包时遇到了一些问题。尝试启动捆绑包时,我得到:

org.plugin.script.plugin-scripter[2]的捆绑启动失败:org.osgi.framework.BundleException:捆绑包2中未解决的约束:包;(package=javax.script)

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

a。通过以下方式在my 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>

还是那达索。我还遗漏了什么?

我会检查以确保某个包正在导出该包。我认为您可以根据您的环境(Felix、Equinox等)使用类似于“headers”的命令来实现这一点。如果您实际上是从某个地方导出它,那么我会尝试将其缩小到特定的版本

希望这有帮助。

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

通常,您希望让bnd导入bundle需要的所有内容。在这里,您告诉它不要导入任何内容(即“!*”)。这里的秩序很重要。因为*匹配任何内容,所以包不会导入任何内容。尝试完全删除导入包(默认情况下会导入所有内容),看看会发生什么。

只是一个随机提示-当您尝试加载捆绑包时,似乎发生了错误,因此您是否检查了您的执行平台是否为Java 1.6?@Stephen感谢您的提示,但这是第一个怀疑。我实际上删除了除1.6之外的所有版本,所以我不认为是这样。啊,新的发展。清单告诉我javax.script包在导出包(uses:)和导入包中,但也在忽略包中,这很奇怪,因为我从来没有这样设置过。谢谢你的提醒!*实际上是这样做的,这样我就可以控制包裹的大小。我想我最好明确地说明单个导入,而不是让bnd抓住所有东西,让罐子变得肥胖。无论如何,我仍然遇到了未解决的约束异常。清单(删除导入包后)看起来很好tbh:manifest版本:1.0导出包:org.plugin.script;用法:=“javax.script,etc”导入包:javax.script,etc开始变得不那么有意义:这里有一些PSome有趣的误解。Import-Package语句对包的大小没有任何影响,包的大小由Private-Package和Export-Package语句控制。Bnd不会“抓住一切”。。。它完全抓住了您在Java代码中使用的内容,仅此而已。所以用!*您实际上是在说“即使我的代码使用这些包,也不要导入它们”。至于未解决的约束错误。。。这仅仅意味着没有其他包导出您的包所需的包。如果您在Java6上运行,“系统包”应该导出这个包,因为它是Java6上标准libs的一部分。如果您运行的是Java 5或更早版本,那么您需要一个单独的包来导出该包。@Neil为更正伙伴欢呼。这是一个巨大的误解,我可以证实你的观察是正确的。我是否需要设置Felix配置,以便它在Java6上显式运行?
org.osgi.framework.system.packages=org.osgi.framework; version=1.3.0, \
    [lots of stuff in between]
    javax.script; \
    version="1.6.0"
<Import-Package>!*,javax.script,org.osgi.framework;version="1.3.0",javax.naming,javax.naming.spi</Import-Package>