Maven和POM.xml中的插件

Raj*_*war 54 java maven-plugin pom.xml maven-3 maven

我刚开始使用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>
Run Code Online (Sandbox Code Playgroud)

问题:我应该在哪里插入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>
Run Code Online (Sandbox Code Playgroud)

在依赖之前还是在dependency标记之后?有关系吗?

omn*_*nom 56

<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>
Run Code Online (Sandbox Code Playgroud)

您也可以将插件中<build>的部分<profile>,如果你使用Maven的配置文件.订单无关紧要.


A_D*_*teo 17

关于两个要点的最后澄清

在哪里放置plugin
一个plugin确实应该在大多数内的情况下被添加build/ plugins节,但有一个重要的区别将其置于内之间的plugins对抗将它内pluginManagement/ plugins.

这种误解通常是Maven中未调用插件的原因或更难以排除故障:

  • build/ 下的插件plugins直接是默认Maven构建的一部分,如果它们指定了一个execution或者它们是否为默认构建配置了什么(见下文)
  • build/ pluginManagement/ 下的插件plugins不一定是默认Maven构建的一部分,也就是管理,它是maven的一个提示:你碰巧使用这个插件,然后请使用我在这里指定的版本,配置和执行,在这个管理中.

    但是使用的意思是什么?意思是:如果/ section中存在相同的插件,则应用此管理(只有这样才有效); 或者如果Maven默认调用插件,那么也应用它. buildplugins

    但是默认情况下如何调用插件?这是maven背后的主要哲学的一部分:约定优于配置.按照惯例,当您指定某个packaging(默认jar,但可以是war)时,您希望调用某些插件.要构建一个jar,默认调用maven-jar-plugin; 构建一个war,默认情况下调用maven-war-plugin等等.因此,如果您在build/ pluginManagement/中plugin为插件指定了一个插件配置,该插件具有与Maven构建的默认绑定,那么它也将被使用.

订购
关于内部分的顺序pom.xml文件,进一步明确要求:它确实无关紧要在大多数的情况下,但是顺序plugin元素wihtin的build/ plugins部分可能是重要的.从Maven 3.0.3(MNG-2258)开始,附加到同一Maven阶段的不同插件执行将按照pom.xml文件中的声明顺序调用.也就是说,在这种情况下排序很重要,因为它可能会影响构建的行为.

此外,dependency声明顺序也可能影响您对依赖性中介的构建,也就是说,在与传递依赖冲突的情况下,第一个声明的依赖性获胜.因此,在某些情况下,订购再次非常重要.

最后但并非最不重要的是,尽管排序对pom.xml文件的其他部分并不重要,但良好的习惯是遵循官方的Maven建议,并且作为简化版本,遵循以下声明顺序:

<project>
  <modelVersion/>

  <parent/>

  <groupId/>
  <artifactId/>
  <version/>
  <packaging/>

  <properties/>

  <dependencyManagement/>
  <dependencies/>

  <build/>

  <reporting/>

  <profiles/>
</project>
Run Code Online (Sandbox Code Playgroud)

sortpom-maven-plugin还可以用于自动应用此标准排序,简单地调用就关注以下pom.xml文件:

mvn com.github.ekryd.sortpom:sortpom-maven-plugin:2.5.0:sort \
     -Dsort.keepBlankLines -Dsort.predefinedSortOrder=recommended_2008_06 
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

  • 解释得很好。谢谢! (2认同)

yat*_*tul 5

<plugin>应放入<plugins>部分,其应被放置到<build><pluginManagement>部分。<dependency><build>部分的顺序无关紧要。

有关pom.xml的完整参考资料在这里:http : //maven.apache.org/pom.html