Spring Framework 5.3.0.M1源码导入Eclipse的笔记
一、准备JDK
把Spring Framework 5.3.0.M1源码导入Eclipse需要两个版本的JDK,分别是:JDK8和JDK11,其中JDK11只取其中的某些类文件
1.准备JDK 1.8.0_251,下载后直接安装
2.准备JDK 1.11.0,下载非安装版,下载后直接解压
二、为JDK 1.8扩展所需要的类文件
1.找到所需要的文件,重新做成jar文件
a、在JDK11解压文件夹/jmods中有两个文件,分别是:jdk.jfr.jmod和java.base.jmod
b、使用解压缩工具打开jdk.jfr.jmod,把classes中的jdk文件夹解压到一临时文件夹
c、把临时文件夹/jdk中的所有字节码文件的咖啡宝贝的版本修改为:52(0x34),例如:
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class ChangeByteCodeVerionByPath {
private static byte temp[] = new byte[1];
public static void main(String[] args) {
if (args.length != 2) {
return;
}
final File baseInputPath = new File(args[0]);
final int version = Integer.parseInt(args[1]);
if (version < 0 || version > 255 || (!baseInputPath.exists()) || (!baseInputPath.isDirectory())) {
return;
}
try {
final File basePath = baseInputPath.getCanonicalFile();
ChangeByteCodeVerionByPath.temp[0] = (byte)(version & 255);
findClassFile(basePath);
} catch (IOException e) {
}
}
private static void findClassFile(File basePath) {
if (basePath.isDirectory()) {
File array[] = basePath.listFiles((FileFilter)(File filename) -> {
if (filename.isDirectory()) {
return true;
}
char[] charArray = filename.getName().toCharArray();
return charArray[charArray.length -6] == '.' &&
charArray[charArray.length -5] == 'c' &&
charArray[charArray.length -4] == 'l' &&
charArray[charArray.length -3] == 'a' &&
charArray[charArray.length -2] == 's' &&
charArray[charArray.length -1] == 's';
});
for(int i = 0; i < array.length; ++i) {
if (array[i].isDirectory()) {
findClassFile(array[i]);
continue;
}
if (array[i].isFile()) {
executeChange(array[i]);
}
}
return;
}
}
private static void executeChange(File file) {
try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) { // must be one of "r", "rw", "rws", or "rwd"
raf.seek(7L);
raf.write(ChangeByteCodeVerionByPath.temp, 0, 1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
d、修改完成后把文件夹jdk压缩成zip格式的文件,例如取名为:jdk-jfr.jar
e、用同样的方式把java.base.jmod中的中的jdk文件夹中的所有字节码文件进行同样的处理,例如取名为:jdk-internal.jar
三、下载Spring Framework源代码文件
1.下载地址:https://github.com/spring-projects/spring-framework
四、解压缩下载后的源代码文件,注:解压到的磁盘卷必须是NTFS、EXT之类的,否则报错
五、从控制台进入到源代码所在的文件夹,例如:E:\spring-framework-5.3.x\spring-framework-5.3.0-M1
set JAVA_HOME=xxx(1.8的JDK) set JRE_HOME=%JAVA_HOME%\jre set CLASSPATH=%JRE_HOME%\lib;重新做的jar文件的绝对路径 set GRADLE_USER_HOME=xxx set GRADLE_HOME=xxx
set GIT_HOME=xxx set PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;%JAVA_HOME%\bin;%GIT_HOME%\bin;%GRADLE_HOME%\bin
以上环境变量需要把JDK、Git、Gradle加入到PATH环境变量中,GRADLE_USER_HOME用于指定被引用的jar文件的路径
六、下载Gradle 6.5
1.下载地址:https://services.gradle.org/distributions/gradle-6.5-bin.zip
2.解压gradle-6.5-bin.zip,解压路径必须与第五步中的GRADLE_HOME相同
七、修改源文件中的build.gradle
1.移除checkstyle的功能,移除前部分代码与移除后的部分代码如下:
修改前的
configure([rootProject] + javaProjects) { project ->
group = "org.springframework"
apply plugin: "java"
apply plugin: "java-test-fixtures"
apply plugin: "checkstyle"
apply plugin: 'org.springframework.build.compile'
apply from: "${rootDir}/gradle/custom-java-home.gradle"
apply from: "${rootDir}/gradle/ide.gradle"
pluginManager.withPlugin("kotlin") {
apply plugin: "org.jetbrains.dokka"
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
allWarningsAsErrors = true
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
}
}
}
test {
useJUnitPlatform()
include(["**/*Tests.class", "**/*Test.class"])
systemProperty("java.awt.headless", "true")
systemProperty("testGroups", project.properties.get("testGroups"))
systemProperty("io.netty.leakDetection.level", "paranoid")
}
checkstyle {
toolVersion = "8.33"
configDirectory.set(rootProject.file("src/checkstyle"))
}
dependencies {
testCompile("org.junit.jupiter:junit-jupiter-api")
testCompile("org.junit.jupiter:junit-jupiter-params")
testCompile("org.mockito:mockito-core")
testCompile("org.mockito:mockito-junit-jupiter")
testCompile("io.mockk:mockk")
testCompile("org.assertj:assertj-core")
// Pull in the latest JUnit 5 Launcher API to ensure proper support in IDEs.
testRuntime("org.junit.platform:junit-platform-launcher")
testRuntime("org.junit.jupiter:junit-jupiter-engine")
testRuntime("org.apache.logging.log4j:log4j-core")
testRuntime("org.apache.logging.log4j:log4j-slf4j-impl")
testRuntime("org.apache.logging.log4j:log4j-jul")
// JSR-305 only used for non-required meta-annotations
compileOnly("com.google.code.findbugs:jsr305")
testCompileOnly("com.google.code.findbugs:jsr305")
checkstyle("io.spring.javaformat:spring-javaformat-checkstyle:0.0.15")
}
修改后的:
configure([rootProject] + javaProjects) { project ->
group = "org.springframework"
apply plugin: "java"
apply plugin: "java-test-fixtures"
apply plugin: 'org.springframework.build.compile'
apply from: "${rootDir}/gradle/custom-java-home.gradle"
apply from: "${rootDir}/gradle/ide.gradle"
pluginManager.withPlugin("kotlin") {
apply plugin: "org.jetbrains.dokka"
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
allWarningsAsErrors = true
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
}
}
}
test {
useJUnitPlatform()
include(["**/*Tests.class", "**/*Test.class"])
systemProperty("java.awt.headless", "true")
systemProperty("testGroups", project.properties.get("testGroups"))
systemProperty("io.netty.leakDetection.level", "paranoid")
}
dependencies {
testCompile("org.junit.jupiter:junit-jupiter-api")
testCompile("org.junit.jupiter:junit-jupiter-params")
testCompile("org.mockito:mockito-core")
testCompile("org.mockito:mockito-junit-jupiter")
testCompile("io.mockk:mockk")
testCompile("org.assertj:assertj-core")
// Pull in the latest JUnit 5 Launcher API to ensure proper support in IDEs.
testRuntime("org.junit.platform:junit-platform-launcher")
testRuntime("org.junit.jupiter:junit-jupiter-engine")
testRuntime("org.apache.logging.log4j:log4j-core")
testRuntime("org.apache.logging.log4j:log4j-slf4j-impl")
testRuntime("org.apache.logging.log4j:log4j-jul")
// JSR-305 only used for non-required meta-annotations
compileOnly("com.google.code.findbugs:jsr305")
testCompileOnly("com.google.code.findbugs:jsr305")
}
2.移除com.ibm.websphere引用包
找到文件中所有的以dependency开头,且包含有com.ibm.websphere的行,然后移除
主要是目前该包目前已经很难下载了
3.选择性的新增aliyun仓库
找到mavenCentral()所在的行,在该行的后面加上如:
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/spring" }
八、修改settings.gradle
1.只修改前面11行的内容
修改前:
pluginManagement {
repositories {
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
}
}
plugins {
id "com.gradle.enterprise" version "3.2"
id "io.spring.gradle-enterprise-conventions" version "0.0.2"
}
修改后:
pluginManagement {
repositories {
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
maven { url 'https://repo.maven.apache.org/maven2' }
}
}
plugins {
id "com.gradle.enterprise" version "3.2"
}
九、修改spring-tx/spring-tx.gradle
1.找到所有com.ibm.websphere:uow的行,删除
十、修改gradle\wrapper\gradle-wrapper.properties
把distributionUrl=修改为本地的gradle文件,例如:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=file:///E:/gradle/gradle-6.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
十一、临时屏蔽暂不进行编译的文件
1.把spring-tx\src\main\java\org\springframework\transaction\jta\WebSphereUowTransactionManager.java修改为WebSphereUowTransactionManager.java.orig
2.把spring-tx\src\test文件夹更名为spring-tx\src\test.orig
十二、给源代码新增Git版本控制信息
git init
十三、build
1.在第五步进入的控制台中执行gradlew.bat build
执行过程中会有各种网络因素导致的失败,只需重试即可
spring-webflux在测试时需要关闭网络防火墙
十四、执行导入
1.在第五步进入的控制台中执行gradlew.bat eclipse(如果想要导入idea,就执行gradlew.bat idea,就目前测试的结果来看只能二选一)
这个步骤将创建.project文件和.classpath文件
十五、备份所有的源代码中的.classpath文件
十六、把所有的源代码中的*.gradle文件更名为*.gradle.orig
十七、删除spring-core中的.settings文件夹(如果不想删除可更名)
十八、把spring-core中的kotlin-coroutines文件夹移动到源码根文件夹,同时删除kotlin-coroutines中的.settrings文件夹,在kotlin-coroutines中新建文件夹:
kotlin-coroutines/bin/eclipse src/main/java src/main/resources
十九、依次把这些模块导入到Eclipse中即可
File --> Import --> Existing Projects into Workspace --> 填写路径 --> Finish
导入时可能会报错,忽略即可

导入顺序是:
kotlin-coroutines spring-jcl spring-core spring-beans spring-expression spring-instrument spring-aop spring-context spring-tx spring-oxm spring-messaging spring-jms spring-jdbc spring-r2dbc spring-web spring-context-indexer spring-context-support spring-orm spring-webmvc spring-webflux spring-websocket spring-test spring-aspects integration-tests
二十、还原临时屏蔽暂不进行编译的文件
1.把spring-tx\src\main\java\org\springframework\transaction\jta\WebSphereUowTransactionManager.java.orig修改为WebSphereUowTransactionManager.java
2.把spring-tx\src\test.orig文件夹更名为spring-tx\src\test
3.把spring-tx模块中缺失的jar文件引入即可(下载地址:https://github.com/kesic2004/MyJavaDependencies/tree/Modules2/com.ibm.websphere/uow/6.0.2.17/df754f8fe0c9c6f837d00ddcc12632fef16ec239)
完

浙公网安备 33010602011771号