1.概述 部门内用Nexus搭建Maven仓库,仓库中除了有配置阿里云仓库代理和*仓库代理,也有部门自己封装的crmd平台jar包。 总体依赖传递为 spring-boot(官方) --> base-parent(crmd平台包) --> platform-parent(crmd平台包)
--> app-parent(crmd平台包) --> 应用代码,平台的jar包在中间做了一些封装和优化,比如统一spring boot等版本号,部门所有的应用的引用的spring boot版本号一致,便于查询问题。 1).把crmd的包下载到本地仓库后,调整base-parent.pom的仓库地址,用JFrog Artifactory的仓库地址,替换Nexus的仓库地址。 2).本地的settings.xml中,用JFrog Artifactory的仓库地址,替换Nexus的仓库地址。 3)。mvn install 报了一堆的错误,吓死宝宝
2.问题一 报错缺少plugin插件
2.1.报错信息 具体报错截取信息如下:
[WARNING] The POM for org.apache.maven.plugins:maven-site-plugin:jar:3.8.2 is missing, no dependency information available
[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-site-plugin:3.8.2: Plugin org.apache.maven.plugins:maven-site-plugin:3.8.2 or one of its dependencies could not be resolved: Failure to find org.apache.maven.plugins:maven-site-plugin:jar:3.8.2 in http://10.128.22.193:8080/artifactory/group_public_maven/ was cached in the local repository, resolution will not be reattempted until the update interval of group_public_maven has elapsed or updates are forced
2.2.分析思路 从报错信息可以看到,是由于在*仓库下载插件的时候报错,所以检查*仓库是否有相关插件。 从http://10.128.22.193:8080/artifactory/group_public_maven *仓库,搜索相关插件,确实没找到。 后来对照Nexus的*仓库配置,发现有个2个*仓库地址没配置到jfrog。 https://repo1.maven.org/maven2/
https://maven.aliyun.com/nexus/content/groups/public
2.3 解决方案 将这2个地址配置到*仓库组后,再次install,以上报错消失,问题解决
3.问题二 报错[FATAL] The parents form a cycle
3.1.报错信息 具体报错截取信息如下:
[WARNING] The POM for com.ffcs.crmd.platform:crmd-platform-base:jar:2.1.0-20200108.084048-1 is invalid, transitive dependencies (if any) will not be available: 3 problems were encountered while building the effective model for com.ffcs.crmd.platform:crmd-platform-base:[unknown-version]
[ERROR] Invalid packaging for parent POM com.ffcs.crmd.platform:crmd-platform-base:[unknown-version], must be "pom" but is "jar" @
[ERROR] Invalid packaging for parent POM com.ffcs.crmd.platform:crmd-platform-base:[unknown-version], must be "pom" but is "jar" @
[FATAL] The parents form a cycle: com.ffcs.crmd.platform:crmd-platform-base:2.1.0-SNAPSHOT -> com.ffcs.crmd.platform:crmd-platform-base:2.1.0-SNAPSHOT @
3.2.分析思路 用mvn install,是可以正常编译,但是在运行的时候报缺少jar包,经过比对lib目录的jar包,发现是编译的时候,部分jar包没自动打包进来。 mvn dependency:tree命令,查看依赖,发现有个warning:xxx
is invalid, transitive dependencies (if any) will not be available,不是很明显,无法定位问题。 mvn dependency:tree -X命令,显示更多错误信息,如3.1 分析错误日志,同时有fatal和error,先看fatal,是说
crmd-platform-base:2.1.0-SNAPSHOT.pom存在
The parents form a cycle
(大概是 父级节点存在循环依赖)。
于是查看本地仓库的crmd-platform-base:2.1.0-SNAPSHOT.pom,发现本级pom的artifactId与parent的artifactId一致,定位出是pom有问题,原来是上传jar的时候,选择自动选择生成pom,结果生成的pom有问题
<parent>
<groupId>com.ffcs.crmd.platform</groupId>
<artifactId>crmd-platform-base</artifactId>
<version>2.1.0-SNAPSHOT</version>
</parent>
<artifactId>crmd-platform-base</artifactId>
3.3.解决方案 调整手动上传jar方法,一次上传的时候,同时选择jar和pom文件,重新mvn dependency:tree -X,问题解决。
4.总结 解决maven问题,要先对maven的依赖传递有了解。 仓库搜索顺序如下:local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central 父级pom的dependencyManagement里面的jar,你直接在子级工程中写<parent>标签是没有用的,不会自动引入的, 还要重写一下<groupId> ,<artifactId>。 父级pom的直接dependencies里面的jar,你直接在子级工程中写<parent>标签,就自动引入的。 分析错误日志,同时有fatal和error,先看fatal