插件在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.3MNG-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>...部分。

看看这个关于插件的一些基础知识。