【问题标题】:How to identify the source of a package version in the Manifest generated by maven-bundle-plugin如何在maven-bundle-plugin生成的Manifest中识别包版本的来源
【发布时间】:2017-04-27 05:46:56
【问题描述】:

我正在使用 maven-bundle-plugin 从一个 Maven 模块创建一个 OSGI 包。

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <configuration>
        <instructions>
            <Import-Package>
                *
            </Import-Package>
            <Export-Package>
                my.bundle.packages
            </Export-Package>
        </instructions>
    </configuration>
</plugin>

不幸的是,似乎有一个依赖项暴露了 javax.annotation。因此,生成的 Manifest 包含Import-Package: javax.annotation;version="[3.2,4)"

我怎样才能知道哪个依赖导出了这个包?通过使用mvn dependency:list,我已经能够排除一些依赖项(com.google.code.findbugs:annotations 和 com.google.code.findbugs:jsr305),但版本范围仍然存在。 我一直在查看直接依赖项的清单文件,但没有找到任何其他导出 javax.annotation 的 jar。

注意:我可以向 javax.annotation:com.springsource.javax.annotation 添加一个依赖项,并且 Manifest 会正确导入 javax.annotation 1.0.0 版,但这不是必需的,我个人会觉得它更干净排除未知的依赖关系。

【问题讨论】:

  • 哪个依赖jar包含包javax.annotations?
  • 它们都没有,但可能存在嵌套的依赖关系。这个包是 jdk 的一部分,并且在运行时部署了 springsource-bundle
  • 如果你使用 spring 3.x,导入的 3.x 范围可能指向 spring。你能发布你的 pom 内容吗?
  • 我不使用 spring 3.x。 pom 只包含一个依赖列表和上面的插件
  • 如果没有指定包版本,可能是bundle版本造成的。您可以使用 javax.annotation;version=0,* 覆盖版本

标签: java maven osgi maven-bundle-plugin


【解决方案1】:

我怎样才能知道是哪个依赖导出了这个包?

如果您安装了 *nix 控制台和bnd命令行工具,您可以尝试:

mvn dependency:build-classpath | grep jar | tr ':' ' ' | xargs bnd find -e 'javax.annotation'

可能有更好的方法来做到这一点,但这是一个起点

【讨论】:

  • 这在某种程度上很有帮助。我之前确定的依赖项是唯一公开该包的依赖项。但是 Manifest 仍然指定了不正确的版本。
  • 原来我无法正确阅读清单。该命令帮助我找到了有问题的依赖项,并列出了暴露包的 jars
猜你喜欢
  • 2022-05-11
  • 2019-08-11
  • 2011-06-18
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多