maven 插件之间的区别 ( assembly-plugins , jar-plugins , shaded-plugins )

Posted

技术标签:

【中文标题】maven 插件之间的区别 ( assembly-plugins , jar-plugins , shaded-plugins )【英文标题】:Difference between maven plugins ( assembly-plugins , jar-plugins , shaded-plugins) 【发布时间】:2016-11-27 15:29:50 【问题描述】:

我是 maven 的初学者,现在我对这些 maven 插件之间的区别感到困惑。这些都是创建jar文件吗?现在我的问题是

    每个插件中创建的jar有什么区别。(组装插件,jar-plugin,shaded插件)

    每个插件的用途。 (程序集、jar 插件、阴影插件)

    我知道,即使没有指定任何这些插件,一旦键入 mvn package,就会有一个 jar 输出。没有这些插件的输出 jar 和有这些插件的输出 jar 有什么区别? TIA

【问题讨论】:

这实在是太宽泛了,无法回答。查看每个插件的文档以了解它的作用。文档中也有示例。 恕我直言,这是个好问题。对于新手(或许多专家,就此而言)来说,这种选择令人困惑。是的,文档是否足以满足每件事 - 首先不需要 SO。 【参考方案1】:
    maven-jar-plugin:这个插件提供了构建和签署 JAR 的能力。但它只是编译src/main/javasrc/main/resources/ 下的java 文件。它不包括依赖项 JAR 文件。 maven-assembly-plugin:此插件将所有依赖项 JAR 提取到原始类中并将它们组合在一起。它还可以用于通过指定主类来构建可执行 JAR。它仅适用于依赖较少的项目;对于有很多依赖的大型项目,会导致Java类名冲突。 maven-shade-plugin:它将所有依赖项打包到一个 uber-JAR 中。它还可以用于通过指定主类来构建可执行 JAR。这个插件特别有用,因为它合并了特定文件的内容,而不是被relocating classes 覆盖。当 JAR 中存在同名的资源文件并且插件尝试将所有资源文件打包在一起时,需要这样做。

参考:comparison:maven plugin jar,assembly,shade

【讨论】:

large project with many dependencies, it will cause Java class name conflict issue. 那么这些情况该如何处理呢? @mFeinstein 在这种情况下你必须使用 maven-shade-plugin ,你可以在上面已经粘贴的“重定位类”链接中找到更多详细信息【参考方案2】:

Jar plugin

让我们看看下面的命令能说明什么。

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-jar-plugin

它有 3 个目标,helpjartest-jar。我相信您最感兴趣的是jar 目标,根据描述,它执行以下操作:

从当前项目构建一个 JAR。

附带说明,在打包设置为jar 的项目上执行mvn help:effective-pom,表明此插件是自动配置的,并在package 阶段执行。

  <plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <executions>
      <execution>
        <id>default-jar</id>
        <phase>package</phase>
        <goals>
          <goal>jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Assembly plugin

这个有不同的用途。它有 8 个目标,但其中 6 个已被弃用。因此,除了help 目标之外,我们还有single 目标。

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-assembly-plugin

从组装描述符组装应用程序包或分发。此目标适用于绑定到生命周期或直接从命令行调用(前提是所有必需的文件在构建开始之前可用,或者由命令行上此目标之前指定的另一个目标生成)。

当您想要交付比项目的工件(JAR、WAR 等)更多的东西时,您可以使用组装插件,但配置放在另一个文件中。

Shade plugin

主要目标的描述有点令人失望。

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-shade-plugin

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

如果你想生成一个 uber-jar,你最想使用这个插件,这是你在 JAR 中的工件,其中包含所有传递依赖项。

基本上,如果您正在构建一个库,您将坚持使用默认的 JAR 插件。如果你正在构建一个应用程序,你可以考虑使用 shade 插件,但对我来说,它有点快速和肮脏。如果 uber-jar 不是你的口味,或者发行版不适合单个 JAR(外部配置、本机依赖项等),那么你应该选择组装插件。

【讨论】:

以上是关于maven 插件之间的区别 ( assembly-plugins , jar-plugins , shaded-plugins )的主要内容,如果未能解决你的问题,请参考以下文章

maven--插件篇(assembly插件)

maven中plugins和pluginmanagement的区别

Maven Assembly插件介

Maven实战技巧「插件使用专题」Maven-Assembly插件实现自定义打包

maven插件--assembly

maven中的plugins 和 pluginManagement有啥区别