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

Par*_*rag 3 osgi maven-bundle-plugin osgi-bundle

我在Bundle-Classpath上放了一些罐子。下面的行显示了我的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>
Run Code Online (Sandbox Code Playgroud)

这些罐子都有导入包的类,但是从我的看到,它们都具有MANIFEST.MF,它具有自己的(准确的)Import-Package语句列表。

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

Unresolved references to [com.sun.tools.javac, javax.naming, javax.naming.spi, javax.servlet, javax.servlet.http, javax.sql, javax.transaction.xa]
Run Code Online (Sandbox Code Playgroud)

所有这些错误都来自com.springsource.org.h2-1.0.71.jar,所有这些软件包都导入了该jar的清单中。

我无法理解:

  • 如果这些软件包已经导入com.springsource.org.h2-1.0.71.jar的MANIFEST> MF中,为什么会抱怨呢?
  • 为什么问题仅来自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在清单中指定的所有导入都由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文件的规则是什么?是否必须在其主项目的pom中列出其清单的导入(即使在Import-Package中指定了导入)元素?还是这是Maven捆绑插件强制执行的事情?如果是后者,是否有办法摆脱执行?

Che*_*tan 6

当您通过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>
Run Code Online (Sandbox Code Playgroud)

在上面的配置中,我们将此类软件包标记为可选。主要问题是根据您的使用情况确定包装清单

一种快速而肮脏的方法是将所有标记为可选导入。应该作为不得已的手段。由于某些有效的导入将被标记为可选,而OSGi fwk将无法对其进行检查。

        <Import-Package>
          *;resolution:=optional
        </Import-Package>
Run Code Online (Sandbox Code Playgroud)

还要注意,H2 jar是有效的OSGi捆绑包,因此您可以直接部署它。