我该如何查看Maven中有效POM的各部分来源?

17
我在Maven项目中工作,试图理解有效pom中特定设置的来源。我想要追溯到源头,以便找出需要更改的哪些pom文件。我修改了我的父pom、settings.xml文件和其他似乎有影响的pom文件,但是我想要更改的设置仍然存在于有效pom中。
是否有一种方法可以查看有效pom的部分来自哪里?或者,我至少可以看到进入有效pom的pom文件的“依赖”链吗?
本质上,我有一个类似于这个问题的问题:如何从有效POM中删除存储库,但如果有一种追溯源头的方法,那将真正帮助我。
谢谢!
2个回答

7

使用Maven插件

自从maven-help-plugin 3.2.0版本之后,新的verbose标志已添加到effective-pom目标中,它将向您显示此信息。将verbose设置为true将在输出的每一行上添加一个指向源POM文件的注释。输出并不会向您展示完整的依赖关系链,但是它包括源文件的组ID、artifact ID、版本和行号。

您可以通过执行以下Maven命令来生成详细的有效POM(确保使用maven-help-plugin的3.2.0或更高版本):

mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:effective-pom -Dverbose=true

如果我们将这个应用到一个继承自父pom的简单Maven项目中,就像这个例子一样:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.0</version>
  </parent>

  <groupId>org.mycompany</groupId>
  <artifactId>myproject</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>My Project</name>

  <properties>
      <a-property>hello world</a-property>
  </properties>
</project>

然后输出将如下所示(请注意每行末尾的额外XML注释):
<?xml version="1.0" encoding="Cp1252"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 5 -->
  <parent>
    <groupId>org.springframework.boot</groupId>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 8 -->
    <artifactId>spring-boot-starter-parent</artifactId>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 9 -->
    <version>2.4.0</version>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 10 -->
  </parent>
  <groupId>org.mycompany</groupId>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 13 -->
  <artifactId>myproject</artifactId>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 14 -->
  <version>1.0-SNAPSHOT</version>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 15 -->
  <name>My Project</name>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 17 -->
  <description>Parent pom providing dependency and plugin management for applications built with Maven</description>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 12 -->
  <url>https://spring.io/projects/spring-boot/myproject</url>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 21 -->
  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 24 -->
      <url>https://www.apache.org/licenses/LICENSE-2.0</url>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 25 -->
    </license>
  </licenses>
  <developers>
    <developer>
      <name>Pivotal</name>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 30 -->
      <email>info@pivotal.io</email>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 31 -->
      <organization>Pivotal Software, Inc.</organization>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 32 -->
      <organizationUrl>https://www.spring.io</organizationUrl>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 33 -->
    </developer>
  </developers>
  <scm>
    <url>https://github.com/spring-projects/spring-boot/myproject</url>  <!-- org.springframework.boot:spring-boot-starter-parent:2.4.0, line 37 -->
  </scm>
  <properties>
    <a-property>hello world</a-property>  <!-- org.mycompany:myproject:1.0-SNAPSHOT, line 20 -->

使用Apache NetBeans

另一个选择是使用Apache NetBeans IDE,它具有一项功能,可以在每行注释的有效POM文件中注释源链接。

在NetBeans IDE中打开Maven项目的pom.xml文件,并单击编辑器顶部的“Effective”选项卡。通过在编辑器左侧悬停注释,您可以查看源并单击它以立即转到引用的POM文件: Apache NetBeans中effective POM的源代码


4

这个答案 描述了创建有效POM的各个部分。

您可以尝试这个答案中的变体来查看POM层次结构(您所说的"dependency chain")。将以下配置添加到父POM的<build><plugins>部分(暂时)以查看它。

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>groovy-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <id>echo-build-environment</id>
            <phase>validate</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source>
                <![CDATA[
                log.info("POM Hierarchy")
                def rootPom = project;
                while (rootPom.parent != null) {
                    log.info(rootPom.groupId + ':' + rootPom.artifactId + ':' + rootPom.version)
                    rootPom = rootPom.parent;
                }
                log.info(rootPom.groupId + ':' + rootPom.artifactId + ':' + rootPom.version)
                ]]>
                </source>
            </configuration>
        </execution>
    </executions>
</plugin>

(请注意,在纯粹的Groovy中,上面的log.info行可以写成)

(请注意,在纯粹的Groovy中,上面的log.info行可以写成

"${rootPom.groupId}:${rootPom.artifactId}:${rootPom.version}"

Groovy称之为 GString。我知道 gmaven插件处理GStrings与纯Groovy有些不同,但现在没有时间查找详细信息,所以在示例中使用了常规字符串连接。

谢谢@user944849,虽然我不太明白为什么当我把这个放在不同POM的<build><plugins>部分或<build><pluginManagement><plugins>部分时,我似乎没有得到任何输出。我正在运行"mvn clean install"。我尝试了"mvn execute"和"mvn validate:execute",但是它们会抛出错误。我缺少一些关键知识,必须进行一些研究,除非您知道我缺少什么...? - Duff
1
mvn executemvn validate:execute都不会起作用。 execute是一个目标,而不是一个阶段。 validate:execute表示运行validate插件的execute目标;我不确定这个插件是否存在。(如果您正在学习Maven,我强烈建议您进行一些研究,以了解阶段和目标之间的区别。)如果您在父POM的<build> <plugins>部分中有配置,则应作为validate阶段的一部分运行,因此mvn validate应该可以实现。如果没有结果,请尝试使用-X获取调试输出。 - user944849

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接