问题描述
项目 B 的 POM 文件在最新一次提交中引入了一个新的依赖组件,并通过以下配置引入:
<dependency>
<groupId>com.a.w</groupId>
<artifactId>anonymous</artifactId>
<version>16.8.9</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/anonymous.jar</systemPath>
</dependency>
项目 A 的 POM 文件中,引用到了 项目 B 的制品包:
<dependency>
<groupId>com.z.c</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0</version>
</dependency>
此时对项目 A 进行打包,出现问题:
The POM for com.z.c:project-b:jar:1.0.0 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
即 project-b 的 POM 失效,依赖传递不会被接受。
问题分析
通过 Maven 管理项目依赖时会进行依赖传递。即项目 A 依赖于 项目 B,项目 B 又依赖于项目 C,那么项目 A 就会通过项目 B 间接依赖项目 C。Maven 会自动解析这些传递依赖,并将其包含在项目 A 的类路径中。
Maven 中声明为的 system 的依赖有可能不会被传递到依赖它的项目中。此时,如果项目 C 以 system 方式被声明,则项目 A 有可能将不会自动引入项目 C。
不过此处错误是因为 systemPath 使用了 ${} 传递相对路径。因为 ${project.basedir} 是一个相对路径,它指向当前项目的根目录。当项目 A 引用项目 B 时,并不会将项目 B 的 systemPath 路径传递到项目 A 中,这样在项目 A 中构建时,路径会失效。所以尽量要将依赖上传 Maven 仓库,如果必须要用 systemPath 且是在同一台电脑上打包,可以改成使用本机绝对路径。