【问题标题】:Transitive dependencies of a shaded JAR阴影 JAR 的传递依赖
【发布时间】:2016-03-19 16:25:07
【问题描述】:

我已经使用 maven-shade 插件打包了 myjar,并且很想知道它在被客户端 maven 项目引用时会如何表现

在 maven 环境中引用时,maven shaded jar 是否会下载传递依赖项?

我是否能够排除依赖项被 shade 插件打包并假设它们将在客户端引用 myjar 并构建时由 maven 下载?

需要的场景: 1. 从命令行执行 myjar 以显示 AWT Forms 对话框(将写出许可证文件) 2. 客户项目在标准 maven 中引用。 Maven 应该以传递方式下载所有依赖项。

因此,为了满足场景 1,我想包含 forms-1.2.1 的依赖项,但排除在场景 2 期间由客户端下载的所有其他依赖项。

【问题讨论】:

    标签: java maven maven-shade-plugin


    【解决方案1】:

    在 maven 环境中引用时,所有依赖项都使用 pom 文件下载。但是,如果您创建了一个内置所有依赖项的阴影 jar(uber jar),它也可以在非 maven(比如在项目中直接引用为 jar)环境中使用,因为所有依赖项都已经存在。

    【讨论】:

      【解决方案2】:

      您的问题似乎与 Shade 插件无关。

      1. 是的,它会下载传递依赖,只要这些依赖在着色后的最终 POM 中。

      2. 是的,我相信您可以有选择地打包一些依赖项并将它们排除在最终的 POM 中。但是,我不建议您这样做。我只会推荐使用shade插件来

        1. 创建用于部署的 UBER jar 或
        2. 隐藏您真正希望保留在项目内部的依赖项。

        在你的 JAR 中选择性地打包一些依赖会破坏 Maven 的依赖管理机制。


      关于为什么在 JAR 中选择性地打包依赖项会破坏依赖项管理的更新:

      例如,您正在开发依赖于bar-2.0foo-1.0。现在您决定要在您的foo-1.0.jar 中包含bar-2.0 类。

      如果有人依赖你的foo-1.0,并且他想使用bar-2.1,他会遇到麻烦:他的应用程序类路径将包含来自bar-2.0的类(这是foo-1.0的一部分) 和bar-2.1(项目自行声明),你很难预测代码使用的是哪个bar

      因此,shade 插件的用例之一是对依赖项进行遮蔽,这涉及到包重命名(即我的原始答案中提到的遮蔽),而不是直接在 JAR 中包含依赖项。

      【讨论】:

      • 我不明白为什么会“破坏Maven的依赖管理”,你能详细说明一下吗?
      • 感谢 @AdrianShum,我确实需要将 forms-1.2.1 放在 jar 中才能从命令行执行,并且不介意我是否获得所有 form-1.2.1 传递依赖项。我正在寻找关于方案 2 是否会在客户端构建时下载所有其他依赖项的明确答案。
      • 这就是我所说的,你应该确保这是一个只用于执行的 uber jar,而不是供其他依赖。
      • 那么我该如何打包来满足这两种场景呢?应该是可以的
      • 有一个正常的 jar 工件,用于正常的依赖。 Uber jar 可以使用单独的分类器创建,因此不要与主要工件混淆。 maven.apache.org/plugins/maven-shade-plugin/examples/…
      【解决方案3】:

      Maven 仅处理 pom 文件的内容——直接依赖和传递依赖。只要您的项目的 pom 声明了正确的依赖关系,客户端构建就会按预期工作。您使用 shade 插件创建 jar 的事实无关紧要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 2017-12-16
        • 1970-01-01
        • 2010-11-08
        • 2013-05-04
        • 2021-09-27
        • 1970-01-01
        相关资源
        最近更新 更多