osgi - 如何处理来自 Bundle-Classpath 上的 jar 的 Import-Package 条目?

标签 osgi osgi-bundle maven-bundle-plugin

我在我的 Bundle-Classpath 中放了几个 jar 。下面的行显示了我的 pom.xml 中的条目,它使用 Felix 插件为包创建 manigest.mf。

<Bundle-ClassPath>.,lib/com.springsource.org.h2-1.0.71.jar,lib/com.springsource.org.apache.lucene-2.3.2.jar,lib/com.springsource.org.apache.lucene.search-2.3.2.jar</Bundle-ClassPath>

这些 jar 具有导入包的类,但据我所知,它们都有一个 MANIFEST.MF,它有自己的(准确的)Import-Package 语句列表。

但是,当我构建我的项目(使用 Maven 和捆绑插件)时,它会报告错误,因为它无法解析对某些类的引用。具体错误是:

Unresolved references to [com.sun.tools.javac, javax.naming, javax.naming.spi, javax.servlet, javax.servlet.http, javax.sql, javax.transaction.xa]

所有这些错误都来自 com.springsource.org.h2-1.0.71.jar 并且所有这些包都导入到该 jar 的 list 中。

我无法理解:

  • 如果这些包已经在 com.springsource.org.h2-1.0.71.jar 的 MANIFEST>MF 中导入,为什么 Maven 捆绑插件会报错
  • 为什么问题只来自 com.springsource.org.h2-1.0.71.jar ?我尝试删除该特定 jar 并且构建顺利进行,即使 com.springsource.org.apache.lucene.search-2.3.2.jar 在它的 MANIFEST.MF 中也有几个 Import-Package 条目?

关于第二点,我做了一些调查,感觉是有规律的。 com.springsource.org.apache.lucene.search-2.3.2.jar 在其 list 中指定的所有导入都由 com.springsource.org.apache.lucene-2.3.2.jar 满足,这也是指定的在 Bundle-Classpath 上。

com.springsource.org.apache.lucene-2.3.2.jar(位于 Bundle-Classpath 上)满足的 com.springsource.org.h2-1.0.71.jar 的依赖项是错误消息中未列出,但是,Bundle-Classpath 上的 jar 不满足的那些依赖项将在错误消息中列出。

不太清楚发生了什么。关于 Bundle-Classpath 上指定的 jar 文件的规则是什么?他们的导入(即使它们在 Import-Package 中指定)是否必须在主项目的 pom 中列出?或者这是 Maven 捆绑插件强制执行的东西?如果是后者,有没有办法摆脱强制执行?

最佳答案

当您通过 Embed-Dependency 标签嵌入任何 jar 时,maven-bundle-plugin 也会分析该 jar 并将引用的包添加到主机包 Import-Package 列表中。大多数情况下,此类软件包是可选的,具体取决于所使用的功能。例如,在您的用例中,H2 jar 依赖于 Lucene,某些功能的 Servlet API。如果您的使用场景不需要这些功能,那么您可以将这些包标记为可选

<plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>2.3.5</version>
        <extensions>true</extensions>
        <configuration>
          <obrRepository>NONE</obrRepository>
          <instructions>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            ..
            <Embed-Dependency>
              h2
            </Embed-Dependency>
            <Import-Package>
              org.osgi.service.jdbc.*;
              org.apache.lucene.*;
              javax.transaction.*;resolution:=optional,
              *
            </Import-Package>
          </instructions>
        </configuration>
      </plugin>

在上面的配置中,我们将这些包标记为可选。主要问题是根据你的使用情况确定包列表

一种快速而肮脏的方法是将所有标记为可选导入。 应作为最后的手段使用。因为一些有效的导入将被标记为可选,OSGi fwk 将无法检查它们。

        <Import-Package>
          *;resolution:=optional
        </Import-Package>

另请注意,H2 jar 是有效的 OSGi 包,因此您可以直接部署它。

关于osgi - 如何处理来自 Bundle-Classpath 上的 jar 的 Import-Package 条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16936310/

相关文章:

java - 如何外部化 bundle 的配置?

grails - 是否可以将简单的grails应用程序转换为可以在Adobe CQ中运行的OSGi软件包?

java - AEM 6.0 的 OSGi bundle 中部署的包的状态为 Activity 但使用情况存在问题

maven - 无法启动 bundle - 缺少要求(osgi.wiring.package)

osgi - 如何使用 bnd/maven-bundle-plugin 将资源文件从 jar 依赖项包含到 osgi 包中?

java - 无法摆脱 Split 包,多个 jars 提供相同的包

java - 无法从 Karaf 2.2.0 OSGi 容器中的根上下文运行 WAR

osgi - 我应该在关闭资源解析器之前关闭 session 吗

java - 嵌入 javassist 依赖项破坏了 OSGi bundle

Maven-bundle-plugin: osgi.ee=UNKNOWN