插件在Maven和POM.xml中
我刚开始使用Maven,我读到插件是可以使用的附加组件。
一个典型的pom.xml
文件结构是
<project> <groupId>org.koshik.javabrains</groupId> <artifactId>JarName</artifactId> (A fldernamed JarName was created) <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>JarName</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
问题 :我应该在哪里插入一个plugin
标签? 如下所示:
<plugin> <groupId>org.jibx</groupId> <artifactId>jibx-maven-plugin</artifactId> <version>1.2.4</version> <executions> <execution> <goals> <goal>bind</goal> </goals> </execution> </executions> </plugin>
在依赖或dependency
标签之前? 有关系吗?
<project> <groupId>org.koshik.javabrains</groupId> <artifactId>JarName</artifactId> (A fldernamed JarName was created) <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>JarName</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <plugins> <plugin> <groupId>org.jibx</groupId> <artifactId>jibx-maven-plugin</artifactId> <version>1.2.4</version> <executions> <execution> <goals> <goal>bind</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
如果使用mavenconfiguration文件,也可以将插件放在<profile>
的<build>
部分。 订单没有关系。
应该将<plugin>
放置到<plugins>
部分,该部分应放置在<build>
或<pluginManagement>
部分。 <dependency>
或<build>
部分的顺序无关紧要。
关于pom.xml的完整参考在这里: http : //maven.apache.org/pom.html
对两个重要的问题进行了澄清
在哪里放置plugin
一个plugin
的确应该在build
/ plugins
部分的大部分情况下被添加,但是把它放在plugins
与将它放在pluginManagement
/ plugins
之间有一个重要的区别 。
这种误解往往是Maven中一个非调用插件的原因,也是一个更难解决的问题:
-
build
/plugins
下的plugins
直接是默认构build的一部分,如果它们指定了execution
或者它们为默认构buildconfiguration了某些东西(见下文) -
build
/pluginManagement
/plugins
下的plugins
并不是默认Maven构build的一部分,也就是说,是一个pipe理,这是一个提示:你碰巧使用这个插件,然后请使用版本,configuration,执行在这里指定,在这个pipe理中。但是,使用意味着什么呢? 意思是:如果同样的插件也出现在
build
/plugins
部分,那么应用这个pipe理(只有这样才会有效)。 或者如果插件是由Maven默认调用的,那么也应用它。但是默认情况下如何调用一个插件? 这是maven背后的主要哲学的一部分:约定而不是configuration。 按照惯例,当你指定一个特定的
packaging
(默认的jar
,但它可以是例如war
),你希望某些插件被调用。 要构build一个jar
, 默认调用maven-jar-plugin
; 构build一场war
, 默认调用maven-war-plugin
等等。 因此,如果您在build
/pluginManagement
/plugin
为插件创build了一个默认绑定到Maven构build的插件configuration,那么它也将被使用。
订购
关于pom.xml
文件中的部分的sorting, 需要进一步说明 :在大多数情况下它确实是不相关的,但是build
/ plugins
部分的plugin
元素的顺序可能是重要的。 由于Maven 3.0.3 ( MNG-2258
),不同的插件执行连接到相同的Maven阶段将按照它们在pom.xml
文件中的声明顺序被调用。 也就是说, sorting在这种情况下很重要 ,因为它可能会影响构build的行为。
此外, dependency
声明的顺序可能会影响您的构build依赖关系调解 ,也就是说,第一个声明的依赖关系在与传递依赖冲突的情况下获胜。 所以, 在某些情况下 , sorting很重要 。
最后但并非最不重要的一点是,虽然sorting对于pom.xml
文件的其他部分并不重要,但是良好的习惯是遵循官方的Mavenbuild议,并且作为简化版本,遵循以下声明顺序:
<project> <modelVersion/> <parent/> <groupId/> <artifactId/> <version/> <packaging/> <properties/> <dependencyManagement/> <dependencies/> <build/> <reporting/> <profiles/> </project>
sortpom-maven-plugin
也可以用来自动应用这个标准的sorting,只需在相关的pom.xml
文件中调用以下内容:
mvn com.github.ekryd.sortpom:sortpom-maven-plugin:2.5.0:sort \ -Dsort.keepBlankLines -Dsort.predefinedSortOrder=recommended_2008_06
进一步阅读 :
- 堆栈溢出:Maven:什么是pluginManagement?
- 官方Maven文档:Maven POM参考,PluginManagement
- 官方的Maven默认绑定
- 官方Maven doc:依赖调解
- 官方的Maven文档:Maven代码风格和代码惯例
如果你想使用插件来构build,你可以使用下面的结构。
<project> <build> <plugins> </plugins> </build> </project>
您可以在pom.xml文件的两个<plugins>
</plugins>
标记之间的任何位置插入第二个片段。
POM中的分段顺序无关紧要。 一般来说,Maven中都有构build插件和报告插件。 你的情况是使用构build插件,所以你必须把这个<plugin>
块放到<project><build><plugins>...
部分。
看看这个关于插件的一些基础知识。