Apache Storm提交Topology時的默認CLASSPATH問題

       曾經在使用Storm時碰到一個問題:向集羣提交一個新的Topology Jar包,在線運行的卻是舊代碼。自己百思不得其解,後來發現Storm的安裝目錄下(也可以說是Storm的HOME目錄)有一個同名的舊Jar包,刪除後問題解決。。。總結下自己的分析,請路過高手指正:

       首先猜測問題出在Java CLASSPATH上,於是閱讀Storm源代碼去研究,終於在 bin/storm 這個可執行程序中找到原因。本質上, bin/storm是一個python腳本,它在執行時會把/home/test/storm-0.9.0.1/ 和 /home/test/storm-0.9.0.1/lib 兩個目錄下的所有jar包都加入CLASSPATH, 因而Storm在選擇Topology Jar包源時,先選擇了/home/test/storm-0.9.0.1/ 下的同名jar包,這個同名的舊jar包被copy到Nimbus的data目錄,進而分發給supervisor。

       解決問題後順便溫習Java CLASSPATH, 作爲C程序員來總結下自己的理解:

       爲什麼需要CLASSPATH?

       Java編譯器及虛擬機默認從當前目錄尋找所依賴Java類的.class文件; 如果需要的.class文件不在當前目錄,Java會從CLASSPATH所指定的目錄中尋找.class文件。

       JVM執行一個Java程序時,相當於動態加載;即只有當這個類被調用的時候,Java虛擬機纔會載入它。CLASSPATH告訴Java虛擬機或者編譯器,文件系統中哪些文件定義了要用到的類。

       Java虛擬機按照下述流程來尋找和載入類:

        <1> 系統導入類: Java平臺內部的基礎類,包括Java類庫的公共類和爲其服務的私有類。

        <2> 擴展類:存在於JRE或者JDK擴展目錄下的jar包,如jre/lib/ext/。

        <3> 用戶定義的包和類庫

        Linux下如何自己指定所依賴的jar包

        $ java   test.jar   -cp   /home/test/dependency.jar       ===> 這種指定依賴的方式可以只對test.jar起作用,而不影響其他應用。

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