【问题标题】:How can I see where portions of an effective pom (in Maven) come from?我怎样才能看到一个有效的 pom 部分(在 Maven 中)来自哪里?
【发布时间】:2015-09-01 13:04:18
【问题描述】:

我正在 Maven 中开发一个项目,我试图了解某些设置在有效 pom.xml 中的来源。我想向后追溯,以便找出需要更改的 pom 文件。我已经修改了我的父 pom、我的 settings.xml 文件以及任何其他似乎起作用的 pom,但我想要更改的设置仍然存在于有效的 pom 中。

有没有办法查看有效 pom 的部分来自哪里?或者,如果你愿意的话,我至少可以看到进入有效 pom 的 pom 文件的“依赖”链吗?

基本上我有一个与这个问题类似的问题:How to remove repositories from Effective POM 但如果有一种方法可以向后追溯,那真的会帮助我。

谢谢!

【问题讨论】:

    标签: maven debugging dependencies pom.xml parent-pom


    【解决方案1】:

    This answer 描述了创建有效 POM 的各个部分。

    您可以尝试使用this answer 的变体来查看 POM 层次结构(您称之为“依赖”链)。将此配置添加到父 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 行可以写成

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

    Groovy 称这些为GStrings。我知道 gmaven 插件处理 GStrings 与普通 Groovy 略有不同,但现在没有时间查看详细信息,因此在示例中使用了常规字符串连接。)

    【讨论】:

    • 谢谢@user944849,虽然我不太明白为什么当我把它放在不同POM的 部分或 部分时,我似乎没有得到任何输出。我正在运行“mvn clean install”。我尝试了“mvn execute”和“mvn validate:execute”,但这些都会抛出错误。我错过了一些关键知识,必须做一些研究,除非你知道我错过了什么......?
    • mvn execute & mvn validate:execute 将不起作用。 execute 是一个目标,而不是一个阶段。 validate:execute 表示运行execute 插件的execute 目标;我不确定是否存在。 (如果您正在学习 Maven,我强烈建议您进行一些研究以了解阶段和目标之间的区别。)如果您在父 POM 的 &lt;build&gt;&lt;plugins&gt; 部分中有配置,它应该作为 validate 阶段的一部分运行,所以mvn validate 应该这样做。如果没有结果,请尝试使用-X 获取调试输出。
    【解决方案2】:

    使用 Maven 插件

    自 maven-help-plugin 版本 3.2.0 以来,新的 verbose 标志已添加到 effective-pom 目标中,它将向您显示此信息。将verbose 设置为true 将为指向源POM 文件的输出中的每一行添加注释。输出不会显示完整的依赖链,但它确实包含源文件的组 ID、工件 ID、版本和行号。

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

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

    如果我们将其应用于一个简单的 Maven 项目,该项目继承自父 pom,如下例所示:

    <?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 cmets):

    <?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 文件,然后单击编辑器顶部的“有效”选项卡。通过将鼠标悬停在编辑器左侧的注释上,您可以查看源代码并单击它以立即转到引用的 POM 文件:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多