在使用minimizeJar函数时,Maven shade插件如何决定将哪些依赖项放入最终jar?

时间:2014-07-21 19:12:03

标签: maven junit maven-shade-plugin

我有一个带有一个java文件的Maven项目,它使用Maven shade插件创建一个超级jar。我的目标是创建一个尽可能小的可执行jar。我决定使用插件中的minimizeJar参数来减小我的jar。参数是仅放入运行所需的依赖项还是要编译的依赖项或两者兼而有之?

1 个答案:

答案 0 :(得分:1)

答案是您链接到的页面的更上一层:

  

<强>遮阳:遮阳

     

全名:org.apache.maven.plugins:maven-shade-plugin:2.3:shade

     

描述:执行着色委托给着色器组件的Mojo。

     

属性:

     
      
  • 需要执行Maven项目。
  •   
  • 要求范围内工件的依赖性解析:运行时。
  •   
  • 目标是线程安全的,并支持并行构建。
  •   
  • 默认情况下绑定到生命周期阶段:package。
  •   

所以包含的工件将是运行时(因此编译时也是如此)。

编辑:有关范围的完整说明,请参阅Introduction to the dependency mechanism - Dependency Scope

在maven中,当你进行依赖项解析时,它会使用范围的概念 - 最重要的三个是(来自该页面):

  • 编译 - 这是默认范围,如果未指定,则使用此范围。 编译依赖项在项目的所有类路径中都可用。 此外,这些依赖项将传播到依赖项目。
  • 运行时 - 此范围表示不需要依赖项 用于编译,但是用于执行。它在运行时和测试中 classpaths,但不是编译类路径。
  • 测试 - 此范围 表示正常使用时不需要依赖项 应用程序,仅适用于测试编译和 执行阶段。

因此,当您在 src / main / java 下编译源代码时,您将使用 compile 范围内的依赖项。运行应用程序时,将使用 compile runtime 范围的依赖项。编译测试时(在 src / test / java 下),您将使用编译测试范围。使用surefire运行测试时,您将使用 compile test runtime 范围的依赖项。

这意味着minimizeJar将包含 compile runtime 范围的依赖项。