一直以來,都想要閱讀某些Java開源項目的原始碼,甚至想要修改某些代碼,實現對開源項目進行二次開發的目的。但總是不知從何入手,直接將開源項目的原始碼匯入Eclipse,總是會報很多錯誤,而無法編譯。可以直接通過Eclipse開啟開源項目的原始碼,至少能夠達到可視化源碼閱讀、源碼導航的目的,還是能在一定程度上解決源碼閱讀不爽的問題,因為直接開啟並沒有改變源檔案項目的目錄結果,對於修改過後的代碼,可以通過命令列找到源檔案項目目錄,並使用mvn或者ant對項目進行編譯,再查看修改後的項目是否正確。
由於當前Java開源項目幾乎都是採用maven或者ant的方式打包的,所以上述方法再一定程度上解決了閱讀源碼的問題,至少通過Eclipse能夠實現源碼之間的導航,但是想要通過Eclipse進行編譯原始碼,甚至調試就無法辦到了。
這麼強大的Eclipse,怎麼用起來這麼力不從心呢,罪魁禍首還是自己太孤陋寡聞了,這麼強大的maven,Eclipse怎麼會沒有外掛程式支援呢,有了maven外掛程式,Eclipse匯入maven項目(也就是大多數開源項目的目錄結構),在Eclipse上面就能夠直接進行編輯,甚至通過Eclipse去編譯、調試源項目。
既然知道了怎樣閱讀開源項目的原始碼,接下來就是安裝Eclipse的maven外掛程式,然後原始碼、二次開發...
前面說了這麼多廢話,是否真的有效呢,下面以Axis2原始碼為例,做一個小實驗例子,修改services/listServices請求的處理源碼,使得原先僅支援WSDL方式描述的Web服務現在也支援OWL4WS的Web服務描述。
第一步:安裝maven
安裝maven實在是簡單,從 http://maven.apache.org/download.html 下載最新的maven版本,然後解壓,配置MAVEN_HOME和MAVEN_OPTS以及path環境變數即可。MAVEN_HOME指向maven的跟目錄,MAVEN_OPTS配置maven執行時的參數,由於MAVEN預設設定的記憶體比較少,編譯大項目時可能會出現OutofMemory的情況,如我沒有設定MAVEN_OPTS而編譯Axis2的源碼時就出現了OutofMemory的情況,最後配置path,指向%MAVEN_OPTS%\bin即可。使得在命令列介面中能夠直接使用maven命令。更多關於maven的介紹,推薦一本書給大家:《Maven實戰》,也有叫《Maven in action》,是一個中國人寫的,淺顯易懂。
第二步:安裝Eclipse的maven外掛程式
Help->Install New Software->Add,添加如下內容:
m2e - http://download.eclipse.org/technology/m2e/releases 如 http://www.eclipse.org/m2e/download/ 所示,上述外掛程式的路徑應該為m2e的最新版本,使用之前的版本可能會出現依賴其他外掛程式的情況,導致m2e外掛程式安裝不上,SB的Eclipse也沒有提示m2e到底依賴哪些外掛程式導致其安裝不上,度娘倒是能夠提供一下協助,但是幾乎不能找到一個能夠使用的。
安裝完m2e外掛程式之後,就能通過Eclipse開啟maven格式的項目,並能夠藉助Eclipse對maven格式的源項目進行編譯,當然也可以直接通過Eclipse建立一個Maven項目,從而使用maven的方式管理你的項目。maven實在是強大,如果你使用Java語言寫程式,瞭解maven真心是有必要。安裝完後再建立項目或者匯入項目時,就可以選擇Maven進行了。安裝完外掛程式後會看到如下效果:
第三步:在Eclipse中修改原始碼
通過Eclipse匯入maven項目,就能使用Eclipse的可視化導航功能對源碼進行閱讀及修改,還能直接執行相關的mvn命令,匯入後的程式如下圖所示:
第四步:通過mvn package編譯並打包源碼,得到發行版本,進行測試
有了maven,原始碼的編譯及打包就變得容易多了,可以直接通過Eclipse進行,選擇項目右鍵Run As或者按右鍵項目的pom.xml檔案Run As即可。如下圖所示:
當然,也可以直接通過命令列進行打包編譯,我選擇採用命令列進行,由於我只修改了Axis2源碼中的兩個模組,這兩個模組分別是axis2-transport-http和axis2-webapp。對這兩個模組的命令列編輯命令如下:
[plain] view plain copy print ? C:\OpenSource\axis2-1.6.0-src\axis2-1.6.0\modules\transport\http>mvn clean install [INFO] BUILD SUCCESS C:\OpenSource\axis2-1.6.0-src\axis2-1.6.0\modules\webapp>mvn clean package [INFO] Building war: C:\OpenSource\axis2-1.6.0-src\axis2-1.6.0\modules\webapp\target\axis2.war [INFO] BUILD SUCCESS
mvn install是將axis2-transport-http模組安裝到maven本地倉庫中,而mvn package是將來源程式按指定的格式打包,由於webapp模組的pom.xml檔案中指定了很多相依模組,包括其他項目的或者axis2本身的模組,如transport-http模組,打包時會從本地倉庫中自動擷取其依賴的模組,並打包。如果本地倉庫中沒有相應的模組,會去網上自動下載,這也是為什麼第一次編譯開源項目時會花費很長時間的原因。
將axis2.war包拷貝到tomcat的webapp目錄下,啟動tomcat,在瀏覽器中輸入http://localhost:8080/axis2/services/listServices,即可看到修改後的頁面已經對OWL4WS進行了支援。如下圖所示:
回過頭來,發現本篇文章儘是廢話,不過就是想表達一下,maven真心是灰常強大,對於想要閱讀Java開源項目原始碼,或者有在這些原始碼的基礎上進行二次開發衝動的童鞋,一定不要錯過maven的學習,不過感覺這種方式在修改原始碼,然後進行測試這種方式還是非常不方便,命令列編譯,還得copy到tomcat下測試回合,哪位有更好的閱讀原始碼並進行二次開發的方式,請你一定要告訴我啊。