我是maven的初学者,现在我对以下3个Maven插件之间的区别感到困惑:
maven-assembly-plugin
maven-jar-plugin
maven-shade-plugin
所有这些插件都创建jar文件吗?如果是,它们创建的Jar文件之间有什么区别?每个插件的目的是什么?每个插件应该在什么上下文中使用?
xpszyzbs1#
src/main/java
src/main/resources/
polkgigr2#
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阶段执行。
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-jar-plugin
help
jar
test-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-pluginMojo执行着色委托给Shader组件。如果您想生成uber-jar,您最想使用这个插件,它是JAR中的工件,其中包含所有传递依赖项。基本上,如果你正在构建一个库,你会坚持使用默认的JAR插件。如果你正在构建一个应用程序,你可以考虑使用shade插件,尽管对我来说,它有点快速和肮脏。如果uber-jar不是你的口味,或者发行版不能容纳在单个JAR中(外部配置,本地依赖等),那么你应该使用汇编插件。
single
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-assembly-plugin
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-shade-plugin
2条答案
按热度按时间xpszyzbs1#
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
polkgigr2#
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
阶段执行。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中(外部配置,本地依赖等),那么你应该使用汇编插件。