[Maven] 含<parent>的pom.xml报"parent.relativePath" of POM xxxxxx

0 序

1 问题描述

  • spring boot 项目
  • pom.xml / maven 报
'parent.relativePath' of POM com.know-data.framework:know-data-study-springboot:1.0.0-SNAPSHOT (F:\xxx\know-data-parent\know-data-study-parent\know-data-study-springboot\pom.xml) points at com.know-data.framework:know-data-study-parent instead of org.springframework.boot:spring-boot-starter-parent, please verify your project structure

2 问题分析

  • 发生该问题的根本原因是因为在项目文件夹的外层包含着另一个项目,此时项目文件(pom.xml)无法确定该文件的pom依赖是引用哪一个parent依赖导致的。

  • maven 的 parent 标签的解析顺序

  • relativePath
  • 标签的定义:parent的pom.xml文件的路径
  • 标签的意义:relativePath 的作用是为了找到父级工程的pom.xml;因为子工程需要继承父工程的pom.xml文件中的内容。然后relativePath 标签内的值使用相对路径定位到父工程的pom.xml。
  • 默认情况:默认我们不用写<relativePath>,那默认值就是../pom.xml,会从上级目录中获取parent的pom,我们建多模块的项目就是这个情况。
  • 空标签:<relativePath/>————设定一个空值将始终从(本地/远程)仓库中获取,不从本地路径获取。很常见的场景就是使用springboot的时候

会根据groupId和artifactId在本地和远端maven仓库中找。如果pom.xml对应的不是外层项目,所以这里就会报错

  • local repository
  • remote repositories
首先,会检查相对路径。
   相对路径(如果未明确给出)默认为 ...,即当前项目的父目录中的pom

Maven会检查
a)该目录中是否有pom文件,
b)该pom文件是否包含与当前项目的父级定义中所述的坐标相同的坐标。

如果a)和b)为true,则:将该pom文件用作解析有效pom的父文件。

如果a)是true,而b)是false,则:会给出警告,因为这通常指向错误配置的项目(如您的情况),并且pom被忽略。

如果a)为假,则:检查其他来源。

3 解决方法

3.1 解决方法1

  • 在pom文件中spring-boot-starter-parent依赖中添加 <relativePath/>属性.
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.18.RELEASE</version>
    <!-- relativePath empty tag : lookup parent from repository / relativePath 空标签 : 查询 parent 工程从 仓库中寻找 -->
    <relativePath/>
</parent>

<relativePath>../pom.xml</relativePath> :

    <parent>
        <artifactId>know-data-study-parent</artifactId>
        <groupId>com.know-data.framework</groupId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

3.2 解决方法2

  • 一、内部检查 检查是否在文件夹的内部是否存在直接引用spring-boot-starter-parent依赖的项目 并将其修改为依赖父项目文件。

  • 二、外部检查 文件夹的外部存在另一个包含项目文件的项目,若存在删除其POM文件即可。

Y 扩展:相关问题

Q1 : Maven Install 父工程时,打包失败,报:"parent.relativePath points at wrong local POM"(parent.relativePath指向了错误的本地pom)

1) 问题描述

maven install 父工程时,报错:

D:\Program\Java\jdk1.8.0_261\bin\java.exe -Dmaven.multiModuleProjectDirectory=E:\source_code\Github-Projects\know-data-parent\know-data-study-parent -Djansi.passthrough=true -Dmaven.home=D:\Program\maven\apache-maven-3.8.1 -Dclassworlds.conf=D:\Program\maven\apache-maven-3.8.1\bin\m2.conf -Dmaven.ext.class.path=D:\Program\IDEA\IDEA_COMMUNITY_2023.2\plugins\maven\lib\maven-event-listener.jar -javaagent:D:\Program\IDEA\IDEA_COMMUNITY_2023.2\lib\idea_rt.jar=61335:D:\Program\IDEA\IDEA_COMMUNITY_2023.2\bin -Dfile.encoding=UTF-8 -classpath D:\Program\maven\apache-maven-3.8.1\boot\plexus-classworlds-2.6.0.jar;D:\Program\maven\apache-maven-3.8.1\boot\plexus-classworlds.license org.codehaus.classworlds.Launcher -Didea.version=2023.2.2 -s D:\Program\maven\apache-maven-3.8.1\conf\settings.xml -Dmaven.repo.local=D:\Program_Data\maven_repository install
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.know-data.framework:know-data-study-spring:1.0.0-SNAPSHOT: com.know-data.framework:know-data-study-parent:pom:1.0.0-SNAPSHOT was not found in https://artifactory.xxxx/artifactory/maven-snapshot during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of snapshots has elapsed or updates are forced and 'parent.relativePath' points at wrong local POM @ line 4, column 13
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project com.know-data.framework:know-data-study-spring:1.0.0-SNAPSHOT (E:\source_code\Github-Projects\know-data-parent\know-data-study-parent\know-data-study-spring\pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM for com.know-data.framework:know-data-study-spring:1.0.0-SNAPSHOT: com.know-data.framework:know-data-study-parent:pom:1.0.0-SNAPSHOT was not found in https://artifactory.xxxx/artifactory/maven-snapshot during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of snapshots has elapsed or updates are forced and 'parent.relativePath' points at wrong local POM @ line 4, column 13 -> [Help 2]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

Process finished with exit code 1

2) 问题分析

利用maven插件时,对于多个maven子项目第一次打包(clear或者install)报错 parent.relativePath points at wrong local POM(parent.relativePath 指向了错误的本地pom)。

3) 解决方法

  • 方法0: 【亲测有效】

检查子工程、父工程:子工程所需的父工程信息(包括version、parent.relativePath等)是否正确。
例如本问题中,子工程需要父工程的版本是1.0.0-SNAPSHOT,而父工程中提供的版本号是1.0-SNAPSHOT

  • 方法1:【亲测有效】
    可先将父工程pom.xml内的子模块(<modules>)注释掉,再进行打包,打包完成后,放开注释,重新打包,就不会报错
    (或者把父级pom文件直接拷贝到项目打包路径下也可以(如下代码的com/app/app-interf/1.0-SNAPSHOT目录下))

  • 方法2:【未测验】
    在子pom文件中,按需配置<relativePath>标签的属性值。
    形如:

    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <groupId>com.app.jdbc</groupId>
    <artifactId>jdbc</artifactId>
    <version>1.0-SNAPSHOT</version>

     <parent>
        <artifactId>app-interf</artifactId>
        <groupId>com.app</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

4) 参考文献

X 参考文献

posted @ 2024-03-08 20:42  千千寰宇  阅读(111)  评论(0编辑  收藏  举报