从Maven真正开始;马上有一个很大的惊喜。
我理解(或我认为)胖罐子/超级罐子的概念。将代码与所有依赖项打包在一起,以此类推。maven-shade-plugin
,在一些示例中找到了文档,并检查了其是否有效。现在将其添加到我的POC项目中,该项目来自maven-archetype-quickstart-可能出什么问题了,是吧?
简而言之,快速入门按照以下方式进行安排:
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
...
所以我只是扔了一个用于着色的插件,准备每天称呼它:
<!-- Maven Shade Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<!-- Run shade goal on package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
不太快。首先,我注意到mvn clean package
并没有提到正在执行maven-shade-plugin(就像工作示例一样)。经过数小时的搜索,我盯着脸上的“根本原因”-快速入门原型提供的<pluginManagement>
是莫名其妙地。神奇地删除该标签使maven.shade.plugin可以完成其工作。否则,不。
(副本:https://github.com/alexakarpov/shade-me
unshade
是坏分支,master是好分支。
谈论违反最小惊讶原则,eh =) 有人可以解释发生了什么吗?生成的pom中的注释提到了有关父pom的内容,但是我尚未对多pom设置进行任何操作。
答案 0 :(得分:0)
<pluginManagement>
角色在Maven documentation中进行了描述:
插件管理包含插件元素的方式与插件非常相似,除了不是为该特定项目构建配置插件信息,而是要配置从此项目继承的项目构建。
在原型生成的项目中,它的目标是设置默认版本的默认插件(maven-clean-plugin
,maven-jar-plugin
,...)。请注意,这些默认插件没有出现在您的POM <plugins>
部分中,但被隐式声明为 (您可以通过运行mvn help:effective-pom
对其进行检查)。
但是将插件添加到<pluginManagement>
部分并不会使您的项目调用该插件。在这里,您可以设置配置和要使用的插件版本。要调用该插件,您应该在<plugins>
部分中对其进行绝对声明。
在某些项目中(大多数情况下是多模块项目),您可以看到在父POM的<pluginManagement>
中声明了插件及其配置,然后在需要调用以下信息的模块的<plugins>
部分中进行了引用该插件:因此,您不必在每个模块上重复相同的配置。
<pluginManagement>
。否则,在简单项目上,您只需在<plugins>
部分中声明它们。我还看到了一些项目在<pluginManagement>
中定义了所有配置,只是为了使<plugins>
部分更短,更易读,如以下示例所示。这只是一个品味问题。
<build>
<!-- pluginManagement section : set versions and configurations -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<!-- Run shade goal on package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<!-- plugins section : plugins that are invoked when building the project -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
</plugins>
</build>
您还可以阅读有关StackOverflow的更多信息:Maven : What is pluginManagement?