55 一次gradle編譯獲取不到私服倉庫的包的排查

前言

呵呵 最近編譯項目的時候出現了這樣的一個問題 

私服上面 能夠看到這個包, 但是 命令行裏面編譯的時候 就是拉不下來 

然後 在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下載 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

可以看到這裏的 核心應該是 下載安裝 gradle, 並委託 gradle 執行命令 

 

Install.createDist

核心步驟 就是下載 安裝包, 解壓, 配置權限 等等 

 

Download.download

獲取套接字, 讀取數據, 寫出 

 

 

gradlew 下載 gradle 在哪裏

PathAssembler.getDistribution 

這是下載的 gradle 的相對路徑, 那麼 baseDir 在哪裏呢 

 

PathAssembler.getBaseDir 

這裏的 distributionBase, zipStoreBase 都是 GRADLE_USER_HOME 

 

 GradleUserHomeLookUp 

首先取 系統配置, 如果沒有 則取 默認配置 

 

以我們這裏爲例 

 

我們吧 $hash 的計算方式 抽出來, 以這裏的 gradle-5.2.1 爲例 嘗試計算一下 

 

 

gradlew 委託任務給 gradle

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 吧 

導入項目的時候 使用的默認的 Use default Gradle wrapper 

 

 

完 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章