A模块依赖B模块,B模块依赖C和D模块(C和D是其他项目中的jar);A模块需要用到C或D中的类,通过B模块间接依赖了C和D。此时打包A的时候报错,大致意思是,无法编译使用C或D中的类。 给A模块打包,执行命令:
mvn clean install出现以下错误:
Error:(8,52) java: 程序包com.demo.utils.common.response不存在 Error:(27,5) java: 找不到符号 Error:(35,5) java: 找不到符号 ...编译报错,熟悉的味道。。。 截图中报红的Error随便找一个双击一下,跳转到代码中查看下: 尼玛,这代码也没报红啊。开始排查吧~ ps:代码中也报红就简单了,那明显就是缺少jar包,添加对应的maven依赖就行了。
注意:此时报红的地方,都是B模块所依赖jar中的类,即A模块通过B模块间接依赖的类。
遇到错误不要慌、不要急,不要放过任何一个报错细节!仔细看,其实会发现截图中的一个警告 摘出来是这样的:
The POM for com.demo:demo-common:jar:1.1.22 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details翻译过来是:demo:demo-common:jar:1.1.22的POM无效,传递依赖项(如果有)不可用,请启用调试日志记录以获得更多细节。 提示很清楚,你依赖的这个common包(就是我们说的B模块)传递依赖项不可用了!也就是说我们A模块,通过B模块间接依赖的包,都不可用了。 为啥不可用,我们看看调试日志吧~
我们进入到子模块,使用-X参数查看debug信息,比如我刚才打包的子模块是client:
cd client mvn clean install -X搜索上面的报错信息:The POM for com.demo:demo-common:jar:1.1.22 is invalid 很容易就能搜到,真正的错误信息就在你搜索的下一行,看截图中标红的位置。
当然每个人的错误可能不一样,我的错误是com.demo.xxx:demo-xxx:jar ,意思是demo-xxx这个jar包找不到。demo-xxx这个包是B模块依赖的包,为什么会提示缺失呢?
发现demo-xxx这个依赖,在B模块的pom.xml中没有配置版本!没什么奇怪的,那会使用父项目中定义的版本。但是父项目中定义这个依赖的版本了啊!
注意哈:B模块不一定是使用当前代码父模块中的pom.xml,要看下B模块中pom.xml定义的父模块的版本。 所以要去maven私服中查看1.0.0这个父pom.xml中到底有没有定义demo-xxx这个依赖的版本。
结论:我去私服上查了下,1.0.0这个父pom.xml中,确实没有定义demo-xxx这个依赖的版本,所以导致B模块的pom.xml解析出错,进而导致B模块依赖的所有包都无法下载!最终导致install A模块的时候报错!