事情的背景是这样的,部门有一个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理解不深导致的,希望这篇文章对你有帮助。