呵呵 最近编译项目的时候出现了这样的一个问题
私服上面 能够看到这个包, 但是 命令行里面编译的时候 就是拉不下来
然后 在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 里面找到了 查看版本的地方
然后 我这里能够编译成功的主要原因是 我尝试了一下 使用项目里面的 gradlew 来编译项目, 呵呵 居然编译通过了 ...
然后 就换了一个 5.2.1 版本的 gradle 来编译, 结果 真的是 成了
那么 看来 idea 选项卡里面的 点击, 可能 就是使用到的这个 gradlew 吧
那么 这个 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
可以看到这里的 核心应该是 下载安装 gradle, 并委托 gradle 执行命令
Install.createDist
核心步骤 就是下载 安装包, 解压, 配置权限 等等
Download.download
获取套接字, 读取数据, 写出
PathAssembler.getDistribution
这是下载的 gradle 的相对路径, 那么 baseDir 在哪里呢
PathAssembler.getBaseDir
这里的 distributionBase, zipStoreBase 都是 GRADLE_USER_HOME
GradleUserHomeLookUp
首先取 系统配置, 如果没有 则取 默认配置
以我们这里为例
我们吧 $hash 的计算方式 抽出来, 以这里的 gradle-5.2.1 为例 尝试计算一下
gradle-wrapper 将任务 委托给 gradle
熟悉 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 吧
导入项目的时候 使用的默认的 Use default Gradle wrapper
完