前言

呵呵 最近编译项目的时候出现了这样的一个问题 

私服上面 能够看到这个包, 但是 命令行里面编译的时候 就是拉不下来 

然后 在idea里面的 选项卡里面编译时 ok 的 

然后 导致还是花了很多的时间 在这个问题上面, 哎 虽然是环境问题 

有些时候 这些 无聊的环境问题 还是会开销你很大的一部分的时间的, 呵呵 这里记录一下 这个过程 

 

 

错误信息

2020-04-24T16:24:20.856+0800 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Run tasks'
2020-04-24T16:24:20.856+0800 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Run tasks' completed
2020-04-24T16:24:20.857+0800 [DEBUG] [org.gradle.internal.work.DefaultWorkerLeaseService] Worker lease root.1 completed (0 worker(s) in use)
2020-04-24T16:24:20.858+0800 [DEBUG] [org.gradle.internal.resources.AbstractTrackedResourceLock] Daemon worker Thread 14: released lock on root.1
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Execution failed for task ':compileJava'.
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] > Could not resolve all files for configuration ':compileClasspath'.
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]    > Could not find com.spring:koal:5.0.1.
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]      Required by:
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]          project : > com.spring.framework:user:1.0.23
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Try:
2020-04-24T16:24:20.858+0800 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Run with --stacktrace option to get the stack trace.  Run with --scan to get full insights.

呵呵 命令行执行 gradle build 的时候错误信息提示如下, 找不到 依赖 

 

然后 gradle build --debug 查看一下 编译的详细信息, 我们重点看一下 这个依赖的相关的地方 

// 这个步骤在配置的三个 仓库都有访问, 一个 私服仓库, 两个 阿里云仓库 
2020-04-24T16:23:58.021+0800 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Executing request GET /repository/spring-public/com/spring/koal/5.0.1/koal-5.0.1.pom HTTP/1.1
2020-04-24T16:23:58.021+0800 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Target auth state: UNCHALLENGED
2020-04-24T16:23:58.021+0800 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Proxy auth state: UNCHALLENGED
2020-04-24T16:23:58.037+0800 [DEBUG] [org.apache.http.impl.execchain.MainClientExec] Connection can be kept alive indefinitely
2020-04-24T16:23:58.037+0800 [DEBUG] [org.apache.http.impl.conn.PoolingHttpClientConnectionManager] Connection [id: 311][route: {}->http://nexus-repository:8081] can be kept alive indefinitely
2020-04-24T16:23:58.037+0800 [DEBUG] [org.apache.http.impl.conn.DefaultManagedHttpClientConnection] http-outgoing-311: set socket timeout to 0
2020-04-24T16:23:58.037+0800 [DEBUG] [org.apache.http.impl.conn.PoolingHttpClientConnectionManager] Connection released: [id: 311][route: {}->http://nexus-repository:8081][total kept alive: 1; route allocated: 1 of 20; total allocated: 1 of 20]
2020-04-24T16:23:58.037+0800 [INFO] [org.gradle.internal.resource.transport.http.HttpClientHelper] Resource missing. [HTTP GET: http://nexus-repository:8081/repository/spring-public/com/spring/koal/5.0.1/koal-5.0.1.pom]
2020-04-24T16:23:58.037+0800 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Download http://nexus-repository:8081/repository/spring-public/com/spring/koal/5.0.1/koal-5.0.1.pom'
2020-04-24T16:23:58.037+0800 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Download http://nexus-repository:8081/repository/spring-public/com/spring/koal/5.0.1/koal-5.0.1.pom' completed
2020-04-24T16:23:58.037+0800 [DEBUG] [org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver] No meta-data file or artifact found for module 'com.spring:koal:5.0.1' in repository 'maven'.

// 在私服仓库, 阿里云仓库都没有找到 koal:5.0.1 
2020-04-24T16:24:20.711+0800 [DEBUG] [io.spring.gradle.dependencymanagement.internal.VersionConfiguringAction] Processing dependency 'com.spring:koal:5.0.1'
2020-04-24T16:24:20.711+0800 [DEBUG] [io.spring.gradle.dependencymanagement.internal.VersionConfiguringAction] No dependency management for dependency 'com.spring:koal:5.0.1'
2020-04-24T16:24:20.711+0800 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver] Attempting to resolve component for com.spring:koal:5.0.1 using repositories [maven, maven2, maven3]
2020-04-24T16:24:20.711+0800 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository] Detected non-existence of module 'com.spring:koal:5.0.1' in resolver cache 'maven'
2020-04-24T16:24:20.711+0800 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository] Detected non-existence of module 'com.spring:koal:5.0.1' in resolver cache 'maven2'
2020-04-24T16:24:20.711+0800 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository] Detected non-existence of module 'com.spring:koal:5.0.1' in resolver cache 'maven3'

 

然后 首先说一下 结论, 居然是 由于 gradle 版本 导致的问题, 我命令行里面 编译使用的是 

master:gradle-6.3 jerry$ ./bin/gradle -version

------------------------------------------------------------
Gradle 6.3
------------------------------------------------------------

Build time:   2020-03-24 19:52:07 UTC
Revision:     bacd40b727b0130eeac8855ae3f9fd9a0b207c60

Kotlin:       1.3.70
Groovy:       2.5.10
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          1.8.0_211 (Oracle Corporation 25.211-b12)
OS:           Mac OS X 10.14.4 x86_64

 

然后 如果使用 5.2.1 的 gradle 来进行 编译的话, 就没得问题 

master:dcams jerry$ gradle -version

------------------------------------------------------------
Gradle 5.2.1
------------------------------------------------------------

Build time:   2019-02-08 19:00:10 UTC
Revision:     f02764e074c32ee8851a4e1877dd1fea8ffb7183

Kotlin DSL:   1.1.3
Kotlin:       1.3.20
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_211 (Oracle Corporation 25.211-b12)
OS:           Mac OS X 10.14.4 x86_64

 

 

问题的发现

哎 有点莫名其妙 

然后 因为 idea 选项卡 里面点击 gradle 编译 看不到具体的可执行文件的位置, 所以 还是给排查带来了 很大的阻力 

但是 后面在 选显卡里面的 help 里面找到了 查看版本的地方 

55 一次gradle编译获取不到私服仓库的包的排查_apache

 

然后 我这里能够编译成功的主要原因是 我尝试了一下 使用项目里面的 gradlew 来编译项目, 呵呵 居然编译通过了 ... 

然后 就换了一个 5.2.1 版本的 gradle 来编译, 结果 真的是 成了 

那么 看来 idea 选项卡里面的 点击, 可能 就是使用到的这个 gradlew 吧 

 

 

gradlew下载 gradle

那么 这个 gradlew 下载的 5.2.1 的版本的 包在哪里呢?, 它又是怎么执行的 这个 gradle 呢 

点开 gradlew 的脚本, 拉到最后 看到这里主要是用 java 执行了一个 GradleWrapperMain 的一个类, 在脚本执行前 加上一点调试的输出 

echo $JAVACMD
echo $@

然后执行 ./gradlew -version  

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home//bin/java
-Xdock:name=Gradle -Xdock:icon=/Users/jerry/IdeaProjects/dcams/media/gradle.icns -Dorg.gradle.appname=gradlew -classpath /Users/jerry/IdeaProjects/spring/gradle/wrapper/gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain -version

发现 执行的是 gradle-wrapper.jar  里面的 GradleWrapperMain 

 

然后 java decompiler 看一下 GradleWrapperMain 里面 

GradleWrapperMain.main

55 一次gradle编译获取不到私服仓库的包的排查_maven_02

可以看到这里的 核心应该是 下载安装 gradle, 并委托 gradle 执行命令 

 

Install.createDist

55 一次gradle编译获取不到私服仓库的包的排查_apache_03

核心步骤 就是下载 安装包, 解压, 配置权限 等等 

 

Download.download

55 一次gradle编译获取不到私服仓库的包的排查_spring_04

获取套接字, 读取数据, 写出 

 

 

gradlew 下载 gradle 在哪里

PathAssembler.getDistribution 

55 一次gradle编译获取不到私服仓库的包的排查_apache_05

这是下载的 gradle 的相对路径, 那么 baseDir 在哪里呢 

 

PathAssembler.getBaseDir 

55 一次gradle编译获取不到私服仓库的包的排查_gradle_06

这里的 distributionBase, zipStoreBase 都是 GRADLE_USER_HOME 

 

 GradleUserHomeLookUp 

55 一次gradle编译获取不到私服仓库的包的排查_apache_07

首先取 系统配置, 如果没有 则取 默认配置 

 

以我们这里为例 

55 一次gradle编译获取不到私服仓库的包的排查_apache_08

 

55 一次gradle编译获取不到私服仓库的包的排查_spring_09

我们吧 $hash 的计算方式 抽出来, 以这里的 gradle-5.2.1 为例 尝试计算一下 

 

 

gradlew 委托任务给 gradle

55 一次gradle编译获取不到私服仓库的包的排查_spring_10

gradle-wrapper 将任务 委托给 gradle 

 

 

gradle 的jar包存储

熟悉 maven 的同学应该知道, maven 仓库这边的存储结构 还是非常直接的, $groupId/$artifactId/$version 里面存放的就是 里面的 pom, jar, java-doc, 源码 啊 之类的 

但是 gradle 这边多了一个层级(并且 $groupId 是直接定位, 没有嵌套文件夹), 一个根据 上下文 计算的一个摘要(后面再来填坑) 

master:~ jerry$ ls ~/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.2.3.RELEASE/
112bcf7297361f8cf39d9fdd439112b54f4c535c/
3ef2c27cf36f740d5dba6e8dcdba51be3be87897/
7750c95c96c7a1885c8b1b503ba915bc33ca579a/
master:~ jerry$ ls ~/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.2.3.RELEASE/3ef2c27cf36f740d5dba6e8dcdba51be3be87897/spring-context-5.2.3.RELEASE-sources.jar 
/Users/jerry/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.2.3.RELEASE/3ef2c27cf36f740d5dba6e8dcdba51be3be87897/spring-context-5.2.3.RELEASE-sources.jar
master:~ jerry$ ls ~/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.2.3.RELEASE/112bcf7297361f8cf39d9fdd439112b54f4c535c/spring-context-5.2.3.RELEASE.pom 
/Users/jerry/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.2.3.RELEASE/112bcf7297361f8cf39d9fdd439112b54f4c535c/spring-context-5.2.3.RELEASE.pom

 

 

最后思考一下 gradlew, 这不就是一个 懒汉 么, 哈哈哈 

另外就是 屏蔽 了下载安装的具体细节, easy to use 

 

 

======================= add at 2020.04.27 =======================

idea 为什么使用这个 gradlew

那么 看来 idea 选项卡里面的 点击, 可能 就是使用到的这个 gradlew 吧 

55 一次gradle编译获取不到私服仓库的包的排查_maven_11

导入项目的时候 使用的默认的 Use default Gradle wrapper 

 

 

完