Java 着色JAR的传递依赖

Java 着色JAR的传递依赖,java,maven,maven-shade-plugin,Java,Maven,Maven Shade Plugin,我已经使用maven shade插件打包了myjar,我很想知道它在被客户机maven项目引用时的行为 maven着色jar在maven环境中引用时是否下载可传递依赖项 我是否能够排除shade插件打包的依赖项,并假设当客户端引用myjar和构建时,它们将由maven下载 所需场景: 1.从命令行执行myjar以显示一个AWT表单对话框(它将写出一个许可证文件) 2.客户项目在标准maven中引用。Maven应该以传递方式下载所有依赖项 因此,为了满足场景1的要求,我希望包括forms-1.2.

我已经使用maven shade插件打包了myjar,我很想知道它在被客户机maven项目引用时的行为

maven着色jar在maven环境中引用时是否下载可传递依赖项

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

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


因此,为了满足场景1的要求,我希望包括forms-1.2.1的依赖项,但不包括场景2期间客户端下载的所有其他依赖项。

Maven仅对pom文件的内容进行处理,包括直接依赖项和传递依赖项。只要项目的pom声明了正确的依赖项,客户机构建就会按预期工作。使用shade插件创建jar的事实与此无关。

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

您的问题似乎与着色插件无关

  • 是的,它将下载可传递的依赖项,只要这些依赖项在着色后的最终POM中

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

  • 创建用于部署或部署的UBER jar
  • 隐藏您真正希望保留在项目内部的依赖项 有选择地将一些依赖项打包到JAR中会破坏Maven的依赖项管理机制


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

    例如,您正在开发依赖于
    bar-2.0
    foo-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可以使用单独的分类器创建,这样就不会与主要工件混淆。