java maven-assembly-plugin、maven-jar-plugin和maven-shade-plugin之间的区别?

5us2dqdw  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(205)

我是maven的初学者,现在我对以下3个Maven插件之间的区别感到困惑:

  • maven-assembly-plugin
  • maven-jar-plugin
  • maven-shade-plugin

所有这些插件都创建jar文件吗?如果是,它们创建的Jar文件之间有什么区别?每个插件的目的是什么?每个插件应该在什么上下文中使用?

xpszyzbs

xpszyzbs1#

  1. maven-jar-plugin:这个插件提供了构建和签名JAR的能力。但是它只编译src/main/javasrc/main/resources/下的java文件。它不包括依赖JAR文件。
  2. maven-assembly-plugin:这个插件将所有依赖JAR提取到原始类中并将它们分组在一起。它也可以通过指定主类来构建可执行的JAR。它只在依赖较少的项目中工作;对于具有许多依赖项的大型项目,这将导致Java类名冲突。
  3. maven-shade-plugin:它将所有依赖打包到一个uber-JAR中。它也可以通过指定主类来构建可执行的JAR。这个插件特别有用,因为它合并特定文件的内容,而不是用relocating classes覆盖它们。当JAR中有同名的资源文件并且插件试图将所有资源文件打包在一起时,需要使用这个插件。
    参考:comparison:maven plugin jar,assembly,shade
polkgigr

polkgigr2#

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执行着色委托给Shader组件。
如果您想生成uber-jar,您最想使用这个插件,它是JAR中的工件,其中包含所有传递依赖项。
基本上,如果你正在构建一个库,你会坚持使用默认的JAR插件。如果你正在构建一个应用程序,你可以考虑使用shade插件,尽管对我来说,它有点快速和肮脏。如果uber-jar不是你的口味,或者发行版不能容纳在单个JAR中(外部配置,本地依赖等),那么你应该使用汇编插件。

相关问题