记一次maven聚合项目中子项目引用父项目中properties属性导致编译报错问题

事情的背景是这样的,部门有一个maven聚合项目需要做架构调整,正好是由我来负责。由于项目比较大,子项目比较多,子项目之间的依赖关系复杂等等,所以调整起来也比较麻烦,遇到问题也是在所难免。

下面就来讲述一下,子项目引用父项目中properties属性导致编译报错问题,我是怎么遇到的,又是如何解决的。

1、遇到问题

一开始遇到这个问题,我是懵的,我无非就是对各个子项目执行maven compile操作来验证编译是否通过,当某个子项目编译报错时,我完全不知道问题的源头在哪里,因此我只能查看控制台信息,如下图所示。

我找到了上图中被红色框框住的那行关键的Error日志。

[ERROR] Failed to execute goal on project skpd-api-system:

    Could not resolve dependencies for project com.skpd:skpd-api-system:jar:2.2.0:

        Failed to collect dependencies at com.skpd:skpd-commons:jar:2.2.0:

            Failed to read artifact descriptor for com.skpd:skpd-commons:jar:2.2.0:

                Could not find artifact com.skpd:skpd-cloud:pom:${skpd.version} in user-central (http://192.168.83.161:8081/nexus/content/groups/public/) 
 

这行日志告诉我们,在编译skpd-api-system,其依赖关系是这样的com.skpd:skpd-api-system:jar:2.2.0->com.skpd:skpd-commons:jar:2.2.0-> com.skpd:skpd-cloud:pom:${skpd.version}

问题就出在最后那个${skpd.version},为什么前面的pom都能将${skpd.version}成功解析为2.2.0,而最后一个不能呢

2、回显问题

因此,我新建了一个用于测试的maven聚合项目,来回显部门项目的问题。项目结构如下。

父项目parent-test的pom.xml如下。

<groupId>com.bobo</groupId>
    <artifactId>parent-test</artifactId>
    <version>${my.version}</version>
    <modules>
        <module>child-1</module>
        <module>child-2</module>
    </modules>
    <packaging>pom</packaging>
    <properties>
        <my.version>1.0</my.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.bobo</groupId>
                <artifactId>child-2</artifactId>
                <version>${my.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

子项目child-1的pom.xml如下。

<parent>
        <groupId>com.bobo</groupId>
        <artifactId>parent-test</artifactId>
        <version>${my.version}</version>
    </parent>
    <artifactId>child-1</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.bobo</groupId>
            <artifactId>child-2</artifactId>
        </dependency>
    </dependencies>

子项目child-2的pom.xml如下。

<parent>
        <groupId>com.bobo</groupId>
        <artifactId>parent-test</artifactId>
        <version>${my.version}</version>
    </parent>
    <artifactId>child-2</artifactId>

当对child-1项目进行编译时,就会报出同样的问题。关键的Error日志如下所示。

[ERROR] Failed to execute goal on project child-1:

    Could not resolve dependencies for project com.bobo:child-1:jar:1.0:

        Failed to collect dependencies at com.bobo:child-2:jar:1.0:

            Failed to read artifact descriptor for com.bobo:child-2:jar:1.0:

                Failure to find com.bobo:parent-test:pom:${my.version} in https://maven.aliyun.com/repository/public 

3、解决问题

最终我发现,在编译聚合项目时,有时候不能对子项目单独进行编译,为什么是有时候呢?像上面的child-2项目,单独编译它就没问题,而child-1项目单独编译就有问题了,这是因为child-1项目还依赖了child-2项目

因为当出现此类问题时,要针对父项目进行编译,比如上面例子中的parent-test,编译父项目会连同它的所有子项目一起编译了,这样就不会出现类似上面的问题了。

但是,由于编译父项目会连同它的所有子项目一起编译,如果某个子项目是有问题的呢?这样就会导致整个聚合项目都编译失败

假设我们有一个子项目叫child-3,child-3是有问题的,我们可以在父项目的modules标签中移除child-3从而保证除child之外的项目编译成功,最后再单独解决child-3项目的问题,如下图所示。

好了,今天的问题就总结到这了,归根结底还是由于对maven理解不深导致的,希望这篇文章对你有帮助。

猜你喜欢

转载自blog.csdn.net/xl_1803/article/details/115352225