着色JAR的传递依赖性

时间:2014-12-21 23:28:20

标签: java maven maven-shade-plugin

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

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

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

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

因此,为了满足方案1,我希望包含表单1.2.1的依赖项,但排除方案2期间客户端要下载的所有其他依赖项。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

    1. 创建用于部署的UBER jar或
    2. 您真正希望保留在项目内部的阴影依赖项。
    3. 选择性地在JAR中打包一些依赖项将破坏Maven的依赖管理机制。


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

      例如,您正在开发foo-1.0,这取决于bar-2.0。现在您决定要在bar-2.0中添加foo-1.0.jar课程。

      如果某人依赖您的foo-1.0,并且他想使用bar-2.1,他就会遇到麻烦:他的应用程序类路径将包含来自bar-2.0的类(其中是foo-1.0)和bar-2.1(项目自行声明)的一部分,您几乎无法预测代码使用的bar

      因此,阴影插件的一个用例是遮蔽依赖关系,其中涉及包重命名(即我原来的答案中提到的阴影),而不是简单地直接在JAR中包含依赖关系。

答案 2 :(得分:-1)

Maven完全依赖于pom文件的内容 - 包括直接和传递依赖。只要您的项目的pom声明正确的依赖项,客户端构建将按预期工作。使用shade插件创建jar的事实无关紧要。