IDEA導入spring5.1源碼的構建

作爲一個搞了幾年開發的程序員,和人家說你沒有看過研究過spring源碼,感覺是一件很丟人的事情,以前也仔細看過,但是一直沒有構建過源碼來看。這次趁着病毒肆虐有時間構建了一把,下面寫下心得體會。

這是一次血淚史啊,本來以爲應該是很容易的一件事,但是沒想到花費的時間差不讀夠把spring-core寫一遍的。。。。。。
廢話不說了,直接開搞。
首先千萬不要用idea2017去做這件事,有許多不可預知的錯誤,我就不說了,我說下我用idea2019.3的經歷。
版本工具:spring5.1.x,gradle4,9,jdk 1.8.0_162,kotlin1.2.41,groovy2.4.12,IntelliJ IDEA 2019-3,AspectJ

詳細步驟及坑見下:

1,下載gradle,可以去官網下載,gradle版本需要4.2以上,小編這裏選擇的是gradle4.9版本。
gradle下載地址:https://services.gradle.org/distributions/
我下載的
gradle-4.9-bin.zip
解壓到無漢字目錄,忽略4.6的版本
在這裏忽略插入圖片描述
2.配置gradle環境變量
計算機的系統變量中新建GRADLE_HOME,
在這裏插入圖片描述
path中增加%GRADLE_HOME%/bin;即可
在這裏插入圖片描述
配置完成以後win+r,輸入cmd進入dos界面,鍵入命令gradle -v,若如下圖正確輸出版本信息即可
在這裏插入圖片描述
3.配置gradle默認的本地倉庫,gradle和maven類似,工作時也需要一個本地倉庫,管理工程jar包,可做如下配置,新增GRADLE_USER_HOME,路徑配置成需要的本地倉庫路徑即可。
在這裏插入圖片描述
4.下載AspectJ
Spring實現了AOP(面向切面編程),它依賴AspectJ,因此需要下載AspectJ並安裝,同時配置好環境變量。(盜圖)
在這裏插入圖片描述
打開命令行,cd到AspectJ的jar包所在的文件夾,運行java -jar aspectj-1.9.4.jar命令,打開AspectJ的安裝界面,直接點擊Next,如下圖:
在這裏插入圖片描述
根據提示安裝完成。

5.進入到GitHub官網並搜索spring-framework工程,如下:
在這裏插入圖片描述
下載需要的版本,我這裏是spring-5.1.x
直接下載很慢,大家可以想自己的辦法。
6.下載完成解壓完如下,打開下圖中的綠框文件,這個很關鍵
在這裏插入圖片描述
在這裏插入圖片描述
該文件告訴我們
a,因爲其他項目需要依賴spring-core和spring-oxm,所以我們導入後需要 先編譯這兩個包
b,spring-aspects需要依賴三方jar(精通aop的應該知道spring-aop和 aspectj的關係,在使用註解方式實現spring-aop的時候,需要導入aspectj的jar,有興趣的可以去查閱下官方文檔aop相關文檔),這裏編譯可能會報錯,不影響我們編譯使用,我們先不處理
c,使用工具編譯時,可能會出現內存溢出情況,這裏我們編譯時需要增 加相關參數
-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m

7.接下來大活纔開始了:
本來直接導入到idea就可以開始以後的步驟了,但是由於我的idea不能科學上網導了幾次都拉不下包來,所以都報錯了。於是採取了下邊的方式
在這裏插入圖片描述
在spring解壓包根路徑執行gradlew.bat,然後看到圖片內容即爲成功,如果顯示失敗重複執行幾次就可以,直到看到成功的標記,然後接着執行命令:gradlew :spring-oxm:compileTestJava
在這裏插入圖片描述
gradlew :spring-core:compileTestJava
在這裏插入圖片描述
同樣需要看到成功的標記。

然後IDEA導入源碼,先設置好idea的gradle參數,如下
在這裏插入圖片描述注意紅框內容的修改,我這是idea2019.3可能其他版本不是這個版本,但是大致一樣。
然後將spring源碼導入,選擇gradle構建方式
導入後等待相關編譯完成顯示爲如下樣子
在這裏插入圖片描述
接下來修改spring-framework源碼配置信息
在這裏插入圖片描述
打開上圖文檔
a. 將 dokka方法以及asciidoctor方法註釋
b. task schemaZip(type: Zip) 在某些版本該任務中是沒有兼容window的路徑符號,需要手動修改一下
task schemaZip(type: Zip) {
group = “Distribution”
baseName = “spring-framework”
classifier = “schema”
description = "Builds -${classifier} archive containing all " +
“XSDs for deployment at https://springframework.org/schema.”
duplicatesStrategy ‘exclude’
moduleProjects.each { subproject ->
def Properties schemas = new Properties();

	subproject.sourceSets.main.resources.find {
		/*(it.path.endsWith("META-INF/spring.schemas") || it.path.endsWith("META-INF\\spring.schemas"))
	}?.withInputStream { schemas.load(it) }*/
		it.path.endsWith("META-INF\\spring.schemas")
	}?.withInputStream { schemas.load(it) }

	for (def key : schemas.keySet()) {
		def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')
		assert shortName != key
		File xsdFile = subproject.sourceSets.main.resources.find {
		//	(it.path.endsWith(schemas.get(key)) || it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\')))
			it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\'))
		}

然後最關鍵的一步來了--------》
在這裏插入圖片描述
雙擊如上圖按鈕,開始項目的編譯,等待,這個時間有點長是個拼網速的時候,也看人品,哈哈哈。如果沒成功多執行幾次。如下爲成功:

在這裏插入圖片描述
這個時間完全看網速大家耐心點。
接下來測試一波
在這裏插入圖片描述
顯示如下圖片即爲成功:
在這裏插入圖片描述
注意:圖片上那些其他的錯我也沒有詳細研究,目前沒有影響。

碰到的問題:
1)運行java的main方法出現 Process ‘command ‘D:/jdk8/bin/java.exe’’ finished with non-zero exit value 1
將idea的gradle按如下設置
在這裏插入圖片描述
2)Failed to apply plugin [id ‘com.gradle.build-scan’]

  • What went wrong:
    An exception occurred applying plugin request [id: ‘com.gradle.build-scan’, version: ‘1.8’]

Failed to apply plugin [id ‘com.gradle.build-scan’]
This version of Gradle requires version 2.0.2 of the build scan plugin or later.
Please see https://gradle.com/scans/help/gradle-incompatible-plugin-version for more information.
原因是gradle版本太高了,具體參考:https://docs.gradle.com/enterprise/compatibility/#build_scan_plugin
在這裏插入圖片描述
3)No such property: immutableValues for class: org.gradle.api.internal.tasks.DefaultTaskDependency
修改:spring-beans.gradle

Open File(spring-beans\spring-beans.gradle )
點擊:Open File 然後註釋掉
//compileGroovy.dependsOn = compileGroovy.taskDependencies.values - ‘compileJava’

4)Error:(42, 16) java: 找不到符號: 類 AnnotationTransactionAspect
位置: 類 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration
下邊的圖那拿的別人的
在這裏插入圖片描述
解決方法:主要原因是Idea默認使用的Javac編譯器,而aspectj關鍵字它不認識。這個時候需要我們前期準備的AspectJ編譯器Ajc了。開頭下載的AspectJ排上用場了。

  1. 將Idea的編譯器設置爲Ajc:
    打開:IDEA–Preferences–Build,Execution,Deployment–Compiler–JavaCompiler,將Use compiler設置爲Ajc,將Path to Ajc compiler設置爲AspectJ安裝目錄下的lib文件夾中的aspectjtools.jar文件,同時,可以勾選Delegate to Javac選項,它能夠只編譯AspectJ的Facets項目,而其他普通項目還是交由Javac來編譯。
    在這裏插入圖片描述
    2.將spring-aop_main和spring-aspectjs_main兩個模塊添加AspectJ Facets:
    打開:File–Project Structure–Facets,點擊+號,選擇AspectJ,選擇spring-aop_main。添加完後,同樣的操作,將spring-aspectjs_main模塊也設置AspectJ。(盜圖)
    在這裏插入圖片描述
    再次執行build,已經沒有錯誤了。別忘了下邊的步驟
    在這裏插入圖片描述
    5)1 報錯 Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException
    缺少AspectJ的包,spring AOP就是用aspectj來實現的,是依賴關係!AspectJ是動態代理的一種實現!而spring默認使用的就是AspectJ來實現的動態代理,spring自己的AOP就是使用AspectJ來實現的!
    在這裏插入圖片描述
    6)Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0 這是項目運行過程中的一個提示,目前沒什麼影響,希望有人解決的話留個言。。。。
    7)D:\jdk8\bin\java.exe “-javaagent:D:\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=57873:D:\IntelliJ IDEA 2019.3.2\bin” -Dfile.encoding=UTF-8 -classpath D:\jdk8\jre\lib\charsets.jar;D:\jdk8\jre\lib\deploy.jar;D:\jdk8\jre\lib\ext\access-bridge-64.jar;D:\jdk8\jre\lib\ext\cldrdata.jar;D:\jdk8\jre\lib\ext\dnsns.jar;D:\jdk8\jre\lib\ext\jaccess.jar;D:\jdk8\jre\lib\ext\jfxrt.jar;D:\jdk8\jre\lib\ext\localedata.jar;D:\jdk8\jre\lib\ext\nashorn.jar;D:\jdk8\jre\lib\ext\sunec.jar;D:\jdk8\jre\lib\ext\sunjce_provider.jar;D:\jdk8\jre\lib\ext\sunmscapi.jar;D:\jdk8\jre\lib\ext\sunpkcs11.jar;D:\jdk8\jre\lib\ext\zipfs.jar;D:\jdk8\jre\lib\javaws.jar;D:\jdk8\jre\lib\jce.jar;D:\jdk8\jre\lib\jfr.jar;D:\jdk8\jre\lib\jfxswt.jar;D:\jdk8\jre\lib\jsse.jar;D:\jdk8\jre\lib\management-agent.jar;D:\jdk8\jre\lib\plugin.jar;D:\jdk8\jre\lib\resources.jar;D:\jdk8\jre\lib\rt.jar;D:\idea-workspace\spring-framework-5.1\spring-tomcat-test\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-webmvc\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-webmvc\out\production\resources;D:\idea-workspace\spring-framework-5.1\spring-context\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-context\out\production\resources;D:\idea-workspace\spring-framework-5.1\spring-web\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-web\out\production\resources;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-jasper\8.5.20\79aa189dbecc919aa9d8d22690c968d9058761b6\tomcat-embed-jasper-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-catalina\8.5.20\92696aa5045d619ae0823a718ea92d61efed8705\tomcat-catalina-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\com.alibaba\fastjson\1.2.41\19103e9ce292f711c462a97644d7a883cd20aa40\fastjson-1.2.41.jar;D:\idea-workspace\spring-framework-5.1\spring-aop\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-aop\out\production\resources;D:\idea-workspace\spring-framework-5.1\spring-beans\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-beans\out\production\resources;D:\idea-workspace\spring-framework-5.1\spring-expression\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-expression\out\production\resources;D:\idea-workspace\spring-framework-5.1\spring-core\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-core\build\libs\spring-cglib-repack-3.2.11.jar;D:\idea-workspace\spring-framework-5.1\spring-core\build\libs\spring-objenesis-repack-3.0.1.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-core\8.5.20\b9026ee20f1f6a2b0fc3e51dd806d800901448b0\tomcat-embed-core-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-el\8.5.20\42960f481a8a80f4ffd3b865c2232820e3565bf1\tomcat-embed-el-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.eclipse.jdt\ecj\3.12.3\ade950992eb3caf6ab4f1a88706c755f0bf213d9\ecj-3.12.3.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-jsp-api\8.5.20\c65b05fd6bfe87fb0ef9decc5bcb98fc0c15f92f\tomcat-jsp-api-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-util-scan\8.5.20\5db3cdb6230307b08b94800a1980778fd72b0eea\tomcat-util-scan-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-api\8.5.20\3c0cb9f7257f99fe1101cf7859afe832ce340e40\tomcat-api-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-coyote\8.5.20\25cd5539658b0c8048d2fa09ee1a5163b8d31c0e\tomcat-coyote-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-servlet-api\8.5.20\7785e30c1285e89faa8c94bfcd833a4a1687a7d8\tomcat-servlet-api-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-util\8.5.20\6a5aef537f52be11c0b9d97dc682f0bf8f7f08de\tomcat-util-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-juli\8.5.20\6c0579d329696059f377585d2a51455bf083d9ee\tomcat-juli-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-annotations-api\8.5.20\d22d709fbbc685a97ea119433270d0a8b93a40ec\tomcat-annotations-api-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-jni\8.5.20\7db8aebaf977c28f2557277c78f7bd9fe2b691a0\tomcat-jni-8.5.20.jar;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-jaspic-api\8.5.20\520abe9dbd3557e8f25ae74de9340f9055c09c16\tomcat-jaspic-api-8.5.20.jar;D:\idea-workspace\spring-framework-5.1\spring-jcl\out\production\classes;D:\idea-workspace\spring-framework-5.1\spring-jcl\out\production\resources;E:\develop\gradle-4.9.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-el-api\8.5.20\bcb6adce0a7a8cd3e3408d3f70fbd7d4738ed4c1\tomcat-el-api-8.5.20.jar com.wangyi.test.AnymoreTest
    初始化Example完成
    二月 08, 2020 12:19:12 下午 org.springframework.context.support.AbstractApplicationContext refresh
    警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘resourceHandlerMapping’ defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method ‘resourceHandlerMapping’ threw exception; nested exception is java.lang.IllegalStateException: No ServletContext set
    Exception in thread “main” org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘resourceHandlerMapping’ defined in org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method ‘resourceHandlerMapping’ threw exception; nested exception is java.lang.IllegalStateException: No ServletContext set
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1320)
    這個錯是我自己造成的一個錯,可能你們碰不到。因爲我在自己寫測試的時候在啓動類加錯了東西導致的。如下
    在這裏插入圖片描述
    僅用於提示自己。

嚴格按照我上邊的步驟的話,一般應該沒有問題了,只是比較耗時。所以網速一點要好。

歡迎使用Markdown編輯器

你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支持,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫博客:

  1. 全新的界面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設置你喜愛的代碼高亮樣式,Markdown 將代碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支持甘特圖的mermaid語法1 功能;
  6. 增加了 多屏幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設置 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入代碼:Ctrl/Command + Shift + K
插入鏈接:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替換:Ctrl/Command + G

合理的創建標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支持6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文本的樣式

強調文本 強調文本

加粗文本 加粗文本

標記文本

刪除文本

引用文本

H2O is是液體。

210 運算結果是 1024.

插入鏈接與圖片

鏈接: link.

圖片: Alt

帶尺寸的圖片: Alt

居中的圖片: Alt

居中並且帶尺寸的圖片: Alt

當然,我們爲了讓用戶更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的代碼片

博客設置頁面,選擇一款你喜歡的代碼片高亮樣式,下面展示同樣高亮的 代碼片.

// An highlighted block
var foo = 'bar';

生成一個適合你的列表

  • 項目
    • 項目
      • 項目
  1. 項目1
  2. 項目2
  3. 項目3
  • 計劃任務
  • 完成任務

創建一個表格

一個簡單的表格是這麼創建的:

項目 Value
電腦 $1600
手機 $12
導管 $1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants將ASCII標點字符轉換爲“智能”印刷標點HTML實體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

創建一個自定義列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何創建一個註腳

一個具有註腳的文本。2

註釋也是必不可少的

Markdown將文本轉換爲 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表達式 KaTeX:

Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過歐拉積分

Γ(z)=0tz1etdt. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的信息 LaTeX 數學表達式here.

新的甘特圖功能,豐富你的文章

Mon 06Mon 13Mon 20已完成 進行中 計劃一 計劃二 現有任務Adding GANTT diagram functionality to mermaid
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖:

張三李四王五你好!李四, 最近怎麼樣?你最近怎麼樣,王五?我很好,謝謝!我很好,謝謝!李四想了很長時間,文字太長了不適合放在一行.打量着王五...很好... 王五, 你怎麼樣?張三李四王五

這將產生一個流程圖。:

鏈接
長方形
圓角長方形
菱形
  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支持flowchart的流程圖:

Created with Raphaël 2.2.0開始我的操作確認?結束yesno
  • 關於 Flowchart流程圖 語法,參考 這兒.

導出與導入

導出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章導出 ,生成一個.md文件或者.html文件進行本地保存。

導入

如果你想加載一篇你寫過的.md文件,在上方工具欄可以選擇導入功能進行對應擴展名的文件導入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎

發佈了8 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章