【问题标题】:Maven bundle plugin generates Manifest with wrong or missing versionsMaven 捆绑插件生成带有错误或缺失版本的清单
【发布时间】:2017-08-24 07:07:30
【问题描述】:

调试时,为什么我的包中的服务没有被其他包导入,我注意到,我声明了错误的 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 中看到的是:

进口包装: .....................,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 的行为对我来说似乎是随机的。有时版本被放置在清单中,有时没有,有时来自同一个包的包被放置在 Import-Package 部分,有时没有......现在旧的包版本被放置,好像它被缓存在某个地方......

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

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

【问题讨论】:

    标签: java maven osgi versioning blueprint


    【解决方案1】:

    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 编译的包兼容。

    【讨论】:

    • 哇,这里好像乱七八糟的。实际上,我作为依赖项的 httpcomponents 不是捆绑工件,因此我针对它们进行编译,但在特征描述符中导入 httpcomponents-osgi。似乎我也在调试错误的东西,因为我想检查为什么我的服务没有被其他包导入,但似乎服务被导入了,只有 karaf 控制台没有显示。
    • Yes .. 如果可能,您应该使用 OSGi 捆绑包作为依赖项,因为它将创建正确的导入。当我为 OSGi 项目添加依赖项时,我总是查看依赖项的清单。它通常可以使您免于一些惊喜。在蓝图中,重构时也需要小心,因为蓝图 xml 通常不会被重构。所以我经常觉得我的旧包名仍然被导入,我花了一段时间才找到原因:-)
    猜你喜欢
    • 1970-01-01
    • 2022-05-11
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2020-12-10
    • 2018-12-10
    相关资源
    最近更新 更多