竹子建站怎么樣上海優(yōu)化網(wǎng)站seo公司
今天我們開始Spring源碼的閱讀之旅。閱讀Spring的源碼的第一步當然是編譯Spring源碼。首先我們要去GitHub上將spring源碼給clone下來。
筆者編譯環(huán)境如下:
Spring版本:5.28
https://github.com/spring-projects/spring-framework/tree/v5.2.8.RELEASE
https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
根據(jù)官網(wǎng)的編譯文檔可知我們需要的JDK版本
自行配置
根據(jù)源碼路徑
spring-framework\gradle\wrapper\gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionUrl=file\:/Users/xxxx/Source/gradle-8.3/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
我們知道當前源碼需要的gradle版本以及需要的gradle配置
下載對應的gradle
https://gradle.org/releases/
配置mac環(huán)境變量
GRADLE_USER_HOME=/Users/king/JavaLibrary/gradle-8.3
export GRADLE_USER_HOME
還需要在源碼上方位置更換成本地gradle
distributionUrl=file\:/Users/xxxx/Source/gradle-8.3/gradle-8.3-bin.zip
進行編譯
./gradlew build
發(fā)生如下錯誤
Caused by: org.gradle.jvm.toolchain.internal.NoToolchainAvailableException: No matching toolchains found for requested specification: {languageVersion=21, vendor=any, implementation=vendor-specific} for MAC_OS on x86_64.at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.downloadToolchain(JavaToolchainQueryService.java:180)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.lambda$query$2(JavaToolchainQueryService.java:146)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.query(JavaToolchainQueryService.java:146)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.lambda$resolveToolchain$1(JavaToolchainQueryService.java:124)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.resolveToolchain(JavaToolchainQueryService.java:122)at org.gradle.jvm.toolchain.internal.JavaToolchainQueryService.lambda$findMatchingToolchain$0(JavaToolchainQueryService.java:103)at org.gradle.api.internal.provider.DefaultProvider.calculateOwnValue(DefaultProvider.java:72)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.WithSideEffectProvider.calculateOwnValue(WithSideEffectProvider.java:54)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:82)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:82)at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:108)at org.gradle.api.internal.provider.AbstractMinimalProvider.withFinalValue(AbstractMinimalProvider.java:164)at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:133)at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:26)at org.gradle.api.interna
解決方案
找到項目中 spring-core文件夾中的spring-core.gradle文件中下面這行代碼將21去掉即可!!!
修改前
multiRelease {targetVersions 17 , 21
}
修改后
multiRelease {targetVersions 17
}
如果遇到編譯測試類錯誤,多次編譯就好
eg:
最終會編譯成功
執(zhí)行下邊命令
./gradlew :spring-oxm:compileTestJava
首先我們要對idea進行一些設置,具體如下
然后選擇已存在的源進行導入
然后選中原來的項目。具體如下:
記住上面要選build.gradle文件,然后等待idea建立好緩存
這個時候我們需要修改如下的設置,具體如下:
然后我們需要修改運行的配置為idea運行,不然每次idea運行都會通過gradle去編譯運行——gradle運行編譯特別慢;需要改成idea自己編譯運行。具體如下:
再次說明一下這里不是一定要改,但是如果你不改用默認的則會特別慢,改成idea快的不止一點點。
改完之后便可以建一個子model來測試了,但是一定得建gradle的項目,因為spring源碼這個父項目就是用gradle來開發(fā)的
然后創(chuàng)建好添加以下的依賴。
api(project(":spring-context"))
然后開始開始完善項目的其他
配置類的代碼
package com.ys;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.ys")
public class AppConfig {
}
service的代碼
package com.ys;import org.springframework.stereotype.Component;@Component
public class IndexService {
}
測試類的代碼
package com.ys;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext ac =new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(ac.getBean(IndexService.class));}
}
然后點擊運行。
可以看到我們Spring的源碼就編譯成功,同時測試也成功了。