Maven bundle 插件生成带有错误或缺失版本的清单

Maven bundle plugin generates Manifest with wrong or missing versions

调试时,为什么我的包中的服务没有被其他包导入,我注意到,我声明了错误的 commons-io 版本(1.4 而不是 2.4)。但是,在调用 mvn clean 然后 mnv install 我注意到,旧版本仍然被引用!此外,org.apache.httpcomponents 的版本未声明!

我的有效 POM 如下所示:

..

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.3</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
  <scope>compile</scope>
</dependency>

...

    <plugin>
      <groupId>org.apache.felix</groupId>
      <artifactId>maven-bundle-plugin</artifactId>
      <version>3.3.0</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <id>bundle-manifest</id>
          <phase>process-classes</phase>
          <goals>
            <goal>manifest</goal>
          </goals>
          <configuration>
            <manifestLocation>META-INF</manifestLocation>
            <instructions>
              <_noee>true</_noee>
              <_removeheaders>Import-Service,Export-Service</_removeheaders>
            </instructions>
          </configuration>
        </execution>
      </executions>
      <configuration>
        <manifestLocation>META-INF</manifestLocation>
        <instructions>
          <_noee>true</_noee>
          <_removeheaders>Import-Service,Export-Service</_removeheaders>
        </instructions>
      </configuration>
    </plugin>

我在MANIFEST.MF中看到的是:

Import-Package: .....................,org.apache.com mons.io;version="[1.4,2)",org.apache.http,org.apache.http.client,org.ap ache.http.client.methods,org.apache.http.entity,org.apache.http.impl.cl ient,org.osgi.service.blueprint;version="[1.0.0,2.0.0)",........

现在 maven-bundle-plugin 的行为对我来说似乎是随机的。有时版本放在 manifest 里,有时不放在,有时同一个 bundle 的包放在 Import-Package 部分,有时不放在 ..... =13=]

是否有任何方法可以强制 maven-bundle-plugin 正确解析来自 maven 依赖项的包版本?我不想手动编写版本,因为这是我们使用 Maven 的目的...

一个可能很重要的注意事项:使用这些导入的 class 在蓝图描述符中声明,这就是 maven-bundle-plugin 在第一行找到包的方式,它看起来像插件蓝图支持存在一些问题...

maven bundle 插件使用一些规则来创建 Import-Package 语句。

  • 它只会为实际使用的包创建导入
  • 它将查看蓝图并为其中的一些定义创建导入。例如,如果你声明一个 bean class= 那么它将导入包
  • 如果您导出一个包,那么 maven-bundle-plugin 也会为它创建一个导入。这允许 OSGi 选择最佳导入。这对你的系统的稳定性来说是件好事。
  • 导入的版本取自您在 maven 中引用的包的 Export-Package 语句。如果 Maven 依赖项不是一个包,那么它将从 Maven 版本
  • 中获取版本

在您的情况下,org.apache.commons.io 的导入仍在 [1.4,2) 范围内,因为 commons-io 2.4 包导出此包的版本为 1.4.9999。我想这样做是为了使 commons-io 2.4 与针对 commons-io 1.4 编译的包兼容。