Maven 和 POM 中的插件.xml

2022-08-31 16:08:05

我刚刚开始使用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


答案 1
<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>

您还可以将插件放在“如果您使用 maven 配置文件”部分中。顺序无关紧要。<build><profile>


答案 2

对两个要点的后期澄清

在大多数情况下,应该在哪里放置插件A,但是在/部分中放置插件
A与将其放在/中之间存在重要差异pluginbuildpluginspluginspluginManagementplugins

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

  • / 下的插件是默认 Maven 构建的直接一部分,如果它们指定了一个,或者如果它们为默认构建配置了某些内容(见下文)buildpluginsexecution
  • // 下的插件不一定是默认 Maven 构建的一部分,也就是说,它是一个管理,这是对 maven 的提示:你碰巧使用此插件,那么请使用版本、配置、执行,我在这里指定的执行,在这个管理中。buildpluginManagementplugins

    但是,使用意味着什么呢?意味着:如果/部分中存在相同的插件,则应用此管理(只有这样它才会有效);或者,如果插件默认由Maven调用,则也应用它。buildplugins

    但是默认情况下如何调用插件?这是maven背后的主要理念的一部分:约定胜于配置。按照惯例,当您指定某个(默认 ,但可以是例如),您希望调用某些插件。要构建 一个 ,默认情况下调用 ;以构建 一个 ,默认情况下调用 等。因此,如果您在 // 中为具有与 Maven 构建的默认绑定的插件指定插件配置,则也会使用它。packagingjarwarjarmaven-jar-pluginwarmaven-war-pluginbuildpluginManagementplugin

排序
关于文件中各节的顺序,需要进一步澄清:在大多数情况下,它确实无关紧要,但是/节中的元素顺序可能很重要。从 Maven 3.0.3MNG-2258) 开始,附加到同一 Maven 阶段的不同插件执行将按其在文件中的声明顺序调用。也就是说,在这种情况下,排序很重要,因为它可能会影响生成的行为。pom.xmlpluginbuildpluginspom.xml

此外,声明顺序还可能会影响您对依赖关系中介的生成,也就是说,在与传递依赖项发生冲突时,第一个声明的依赖项获胜。因此,在某些情况下,排序再次变得很重要dependency

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

<project>
  <modelVersion/>

  <parent/>

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

  <properties/>

  <dependencyManagement/>
  <dependencies/>

  <build/>

  <reporting/>

  <profiles/>
</project>

sortpom-maven-plugin也可用于自动应用此标准排序,只需在相关文件上调用以下内容:pom.xml

mvn com.github.ekryd.sortpom:sortpom-maven-plugin:2.5.0:sort \
     -Dsort.keepBlankLines -Dsort.predefinedSortOrder=recommended_2008_06 

进一步阅读


推荐