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

以上环境变量需要把JDKGitGradle加入到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)

 

 

 

  

 

  

posted @ 2023-03-20 18:53  光杆儿司令  阅读(193)  评论(0)    收藏  举报