背景
我们的公司的系统中是以微服务方式开发的。每个项目就是一个微服务,有非常多的微服务,比如用户服务、后台管理服务、订单服务、物流服务、商品服务等等。
其中每个项目都使用的 gradle 构建工具打包、发布、部署。
gradle 是一个项目构建工具,与 maven 类似,它提供非常强大的包依赖管理功能。
现象与问题
1.有些项目打包编译速度非常慢,有时需要 5 到 10 分钟,而且还经常失败。
2.有时候点击三方包的查看源码,通过 IDE 进入类的 class 文件,点击下载源码,控制台显示失败。
3.项目发布的 api 包中,除了 rpc 接口必须的 model,还增加了很多无用的包,导致其他项目引入后,jar 过多。
分析
带着这三个问题开始我们的分析。
问题一:项目打包编译速度非常慢,并且经常失败
通过查看打包日志,发现失败的信息是,编译某个模块时时间过长、通过 maven 仓库下载包的时候经常失败、显示超时信息等等,最终输出不能解析 xxx.xxx.xxx 包。
然后再次重新打包,又经过一段时间漫长的等待,可能会成功,但是时间很长。
在打包时增加 debug 选项查看下打包过程中出现错误的日志信息。
我们发现,项目模块在编译打包的时候,出现访问远程仓库资源 403 的信息。
00:29:59.125 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.DynamicVersionResolver] Using com.xgoods:xabtest-proto:v0.3.0 from Maven repository 'nexus'
00:29:59.125 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.DynamicVersionResolver] Discarding resolve failure.
org.gradle.internal.resolve.ModuleVersionResolveException: Failed to list versions for com.xgoods:xabtest-proto.
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.listModuleVersions(ErrorHandlingModuleComponentRepository.java:126)
...省略...
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.gradle.api.resources.ResourceException: Unable to load Maven meta-data from http://repo.spring.io/release/com/xgoods/xabtest-proto/maven-metadata.xml.
at org.gradle.api.internal.artifacts.repositories.maven.MavenMetadataLoader.load(MavenMetadataLoader.java:55)
at org.gradle.api.internal.artifacts.repositories.maven.MavenVersionLister.listVersions(MavenVersionLister.java:48)
at org.gradle.api.internal.artifacts.repositories.metadata.DefaultMavenPomMetadataSource.listModuleVersions(DefaultMavenPomMetadataSource.java:73)
at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver.doListModuleVersions(ExternalResourceResolver.java:210)
at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver.access$200(ExternalResourceResolver.