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/java
和src/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 个目标,help
、jar
和 test-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中plugins和pluginmanagement的区别