使用Ant編譯SpringFramework-1.0

下載SpringFramework源碼

SpringFramework-3.x以前的版本都在託管在sourceforge.net網站,3.x以後纔開源在Github,而筆者想要SpringFramework-1.0,所以先去sourceforge.net網站(https://sourceforge.net/projects/springframework/files/springframework/)下載源碼。

爲什麼選擇1.0呢?1.0是官方的第一個文檔完備的正式版,相對現在5.x而言,功能還比較簡單,但Spring核心功能已經具備,是學習Spring的最原始、難度相對較小的一個版本。下面附一張1.0的概覽圖:
在這裏插入圖片描述

安裝Ant環境

官網(http://ant.apache.org)下載Ant安裝包,然後配置環境變量:

ANT_HOME=D:\apache-ant-1.9.14
path=%ANT_HOME%\bin

這裏注意Ant的版本,官網介紹中說明了1.9.x需要jdk5以上,1.10.x需要jdk8以上。
筆者實踐時jdk是1.8,下載了1.9.x,編譯時報錯了:
在這裏插入圖片描述
顯示是JDK版本高了,SpringFramework-1.0源碼用了1.4的語法,這裏重新下載jdk1.4。

安裝JDK1.4

去官方(https://www.oracle.com/technetwork/java/archive-139210.html)找jdk1.4安裝包,這裏筆者一開始也踩到了“坑”。
筆者在oracle官方下載一個j2eesdk-1_4_03-windows.exe安裝包,完成後,安裝目錄下面有個jdk目錄:
在這裏插入圖片描述
進入jdk目錄,使用java -version命令顯示卻是java version "1.5.0_06",懷疑自己下載錯了,應該安裝java SE,而不是j2ee。
(筆者上面提供的下載地址是對的)
重新下載一個j2sdk-1_4_2_19-windows-i586-p.exe,再試一次,這次成功安裝了jdk1.4。
在這裏插入圖片描述

IDEA導入源碼

筆者習慣性的使用file - open,這種打開工程的方式在maven工程上從未翻車,但是SpringFramework-1.0是用Ant構建的,這種方式導入源碼雖然不會報錯,但是idea本身識別不了package和src。

嘗試用import project試一下,這次成功,idea成功加載了這個項目。
在這裏插入圖片描述

編譯運行測試用例

編譯環境說明
  • Ant是1.9.x
  • JAVA_HOME=jdk1.8
  • IDEA爲project structure配置的jdk1.4

這裏有個小誤會,筆者以爲:

①Ant默認使用window環境變量配置的jdk1.8;
②而SpringFramework使用在project structure配置的jdk1.4;

編譯報錯說明①是沒錯的,但Ant也會使用jdk1.8去build SpringFramework的工程。因爲jdk8的很多接口發生了改變,導致SpringFramework-1.0用jdk8編譯時發生了很多接口不匹配的問題,具體如下:

    [javac]   (請使用 -source 5 或更高版本以將 'enum' 用作關鍵字)
    [javac] E:\gitlocal\spring-framework-1.0\src\org\springframework\web\util\WebUtils.java:220: 警告: 從發行版 5 開始, 'enum' 爲關鍵字, 而不用作標識符
    [javac]                     String paramName = (String) enum.nextElement();
    [javac]                                                 ^
    [javac]   (請使用 -source 5 或更高版本以將 'enum' 用作關鍵字)
    [javac] E:\gitlocal\spring-framework-1.0\src\org\springframework\jdbc\datasource\DriverManagerDataSource.java:53: 錯誤: DriverManagerDataSource不是抽象的, 並且未覆蓋CommonDataSource中的抽象方法getParentLogger()
    [javac] public class DriverManagerDataSource extends AbstractDataSource implements SmartDataSource {
    [javac]        ^
    [javac] E:\gitlocal\spring-framework-1.0\src\org\springframework\jdbc\support\lob\OracleLobHandler.java:228: 錯誤: 對setBlob的引用不明確
    [javac]                             ps.setBlob(parameterIndex, null);
    [javac]                               ^
    [javac]   PreparedStatement 中的方法 setBlob(int,Blob) 和 PreparedStatement 中的方法 setBlob(int,InputStream) 都匹配

上面只截取了一部分日誌,能看出這是用1.8編譯導致的。
既project structure配置的jdk1.4並沒有用來編譯SpringFramework源碼。
OK,那把JAVA_HOME設置成jdk1.4,再試一次,結果如下:

$ ant build
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/tools/ant/launch/Launcher (Unsupported major.minor version 49.0)

顯示當前jdk版本不支持當前Ant,現在出現了尷尬的矛盾局面,JDK版本既要符合SpringFramework要求,也要支持Ant,否則編譯失敗,只能重新安裝Ant了。
再次安裝了apache-ant-1.5.4-bin.zip,重新編譯,這次成功!

E:\gitlocal\spring-framework-1.0>ant build
Buildfile: build.xml

compileattr:
[attribute-compiler] Generated attribute information for 0 classes. Ignored 0 classes.

build:

BUILD SUCCESSFUL
Total time: 1 second

(筆者使用window cmd編譯的,IDEA的terminal依然不成功)

運行單元測試

  • 命令行中通過ant命令運行是沒有問題的,輸出如下:
E:\gitlocal\spring-framework-1.0>ant tests
Buildfile: build.xml

compileattr:
[attribute-compiler] Generated attribute information for 0 classes. Ignored 0 classes.

build:

compiletestattr:
[attribute-compiler] Generated attribute information for 0 classes. Ignored 1 classes.

buildtests:

tests:
    ......省略
    [junit] Testsuite: org.springframework.web.util.TagUtilsTestSuite
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.114 sec

    [junit] Testcase: testTagUtils took 0.001 sec

BUILD SUCCESSFUL
Total time: 1 minute 39 seconds
  • idea運行某個單元測試
    筆者嘗試了很多次都失敗了,報的錯誤都相同,找不到dom4j的類,疑惑的是lib目錄下明明是有這個jar包的,這是爲什麼呢?
    經過了1個多小時的折騰,終於發現了問題
    在這裏插入圖片描述
    發現Dependencies裏面沒有dom4j,其它的包都有,問題就出在這裏。通過右上角的+ Library添加剩下的所有包,然後重新運行。

這次OK了,至此SpringFramework-1.0源碼可以在本地調試運行了。中間走了很多彎路,踩了很多坑,覆盤如下:

  1. 用慣了maven來構建項目,突然拋開maven,既不會編譯、運行一個項目了;
  2. 老的代碼,依賴的第三方工具也得匹配,比如jdk、ant等;

總結:
隨着技術發展,很多“強大”的工具幫我完成瑣碎的活兒,把我們解放出來了,好處想而易見。但同時也有隱患,那就是漸漸我們失去了研究基本方法的動力和動機,以至於拋開這些工具,我們將變得無所適從。願我們在追捧新技術同時,也不要忘了基礎理論和方法,比如我們既要會使用spring-boot搭建寫代碼,也要會使用servlet。

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