我如何查看有效 pom(在 Maven 中)的部分来自哪里?
How can I see where portions of an effective pom (in Maven) come from?
我正在使用 Maven 开发一个项目,我试图了解有效 pom 中某些设置的来源。我想向后追溯,这样我就可以找出哪些 pom 文件需要更改。我已经修改了我的父 pom、我的 settings.xml 文件和任何其他似乎起作用的 pom,但我想要更改的设置仍然存在于有效的 pom 中。
有没有办法查看 effective-pom 部分的来源?或者,我至少可以看到进入有效 pom 的 pom 文件的 "dependency" 链吗?
基本上我遇到了与这个问题类似的问题:How to remove repositories from Effective POM但是如果有一种方法可以向后追溯,那将真正帮助我。
谢谢!
This answer 描述了创建有效 POM 的各个部分。
您可以尝试使用 this answer 的变体来查看 POM 层次结构(您称之为 "dependency" 链)。将此配置添加到父 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 调用这些 GString
。我知道 gmaven 插件处理 GString 的方式与普通 Groovy 略有不同,但现在没有时间查看详细信息,因此在示例中使用了常规字符串连接。)
使用 Maven 插件
自 maven-help-plugin 版本 3.2.0 以来,新的 verbose
标志已添加到 effective-pom
目标中,它将向您显示此信息。将 verbose
设置为 true
将为指向源 POM 文件的输出中的每一行添加注释。输出没有显示完整的依赖链,但它确实包括源文件的组 ID、工件 ID、版本和行号。
您可以通过执行以下 Maven 命令生成详细有效的 POM(确保使用 3.2.0 或更高版本的 maven-help-plugin):
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,它有一个功能,可以用 link 注释有效的 POM 文件到每一行的源代码。
在 NetBeans IDE 中打开 Maven 项目的 pom.xml 文件,然后单击编辑器顶部的“有效”选项卡。通过将鼠标悬停在编辑器左侧的注释上,您可以查看源代码并单击它以立即转到引用的 POM 文件:
我正在使用 Maven 开发一个项目,我试图了解有效 pom 中某些设置的来源。我想向后追溯,这样我就可以找出哪些 pom 文件需要更改。我已经修改了我的父 pom、我的 settings.xml 文件和任何其他似乎起作用的 pom,但我想要更改的设置仍然存在于有效的 pom 中。
有没有办法查看 effective-pom 部分的来源?或者,我至少可以看到进入有效 pom 的 pom 文件的 "dependency" 链吗?
基本上我遇到了与这个问题类似的问题:How to remove repositories from Effective POM但是如果有一种方法可以向后追溯,那将真正帮助我。
谢谢!
This answer 描述了创建有效 POM 的各个部分。
您可以尝试使用 this answer 的变体来查看 POM 层次结构(您称之为 "dependency" 链)。将此配置添加到父 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 调用这些 GString
。我知道 gmaven 插件处理 GString 的方式与普通 Groovy 略有不同,但现在没有时间查看详细信息,因此在示例中使用了常规字符串连接。)
使用 Maven 插件
自 maven-help-plugin 版本 3.2.0 以来,新的 verbose
标志已添加到 effective-pom
目标中,它将向您显示此信息。将 verbose
设置为 true
将为指向源 POM 文件的输出中的每一行添加注释。输出没有显示完整的依赖链,但它确实包括源文件的组 ID、工件 ID、版本和行号。
您可以通过执行以下 Maven 命令生成详细有效的 POM(确保使用 3.2.0 或更高版本的 maven-help-plugin):
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,它有一个功能,可以用 link 注释有效的 POM 文件到每一行的源代码。
在 NetBeans IDE 中打开 Maven 项目的 pom.xml 文件,然后单击编辑器顶部的“有效”选项卡。通过将鼠标悬停在编辑器左侧的注释上,您可以查看源代码并单击它以立即转到引用的 POM 文件: