在項目的介紹中可以得知,securejsh與ptyhon里面的ipython或者ruby里面的irb非常相似。它們都允許交互式運行語言的代碼,以方便跟蹤或者調試應用。但是,java與ruby、python不同,后者是動態腳本語言,它們天生具有解釋執行的特點(注意:當然python支持預編譯,ruby也將在yarv中開始支持,這里指它們的解釋執行狀態)。我們常見的python和ruby發行版本基本上都包括自己的解釋器(這也是它們的核心組件),但是java是一種需要中間編譯過程的語言,默認情況下它無法直接解釋運行,也沒有相應的解釋器。
那么securejsh是如何實現的呢?讀者首先會想到jsr-223,這個api可以自己擴展腳本語言支持,比如rhino是 javascript解釋引擎。但是使用它難以實現交互操作,因為它必須輸入一個相對完整的腳本才可以運行,這樣會喪失一部分交互性。securejsh 實際上是使用了jdk 6.0的新特性java compiler api(jsr-199),它提供了一組api來讓程序可以動態地訪問java編譯器的接口,這樣就可以使用java編譯器動態檢查代碼語法或者動態根據 java源碼生成可以執行的字節碼。這種方式與asm的編程直接生成字節碼不同,它能直接將java源碼轉換為字節碼,xruby的主力開發者鄭曄(網名 dreamhead)在他的blog中這樣對比了兩種方案:
之前,剛剛在blog中提到asm,里面的代碼生成工作是通過直接寫 字節碼完成的。現在有了compiler api,可以考慮生成代碼以java源碼的形式完成,然后,通過調用compiler api對源碼進行動態編譯,這樣,可以達到同直接寫字節碼類似的作用。使用compiler api,肯定不如直接生成字節碼來得高效,但對于不了解jvm指令的人來說這也許是一種解決方案。
可見jsr-199不是最高效的字節碼生成方案,但是更方便使用。java compiler api不是為了取代asm這樣的方案的,它的本意是以編程的方式實現實時編譯及信息反饋。java目前的主要架構師之一peter von der ahé曾經在他的blog對誰需要使用java compiler api這個問題做了如下解釋:
99%的java開發者都不需要了解java compiler api。只有少數的開發者會直接應用這個api。但是ide、java ee應用程序服務器、maven或者ant還有測試框架的開發者卻不一樣,他們有一個共同點,就死需要調用編譯器將java源碼轉換為類文件(他們是這個 api的潛在用戶)。
可見jsr-199的產生主要是面向熱部署或者增量編譯這樣的場合,但是securejsh的產生擴展了java compiler api的應用場景,同時也增強了java和jvm的交互性。complystill這樣介紹了securejsh的應用場景和需求:
securejsh允許java編寫的服務器端應用程序為管理員、客戶、開發者和客戶端服務提供一個安全shell,這里可以交互性地讓java語言逐句運行。securejsh需要jdk 6.0或者jre 6.0加javac(在classpath中)來運行。
securejsh的官方首頁這樣描述了它的主要特性:
安全:securejsh在服務器端實現了rfc-4251,ssh 2.0協議,支持公鑰認證,這種方式方便安全(不需要每次輸入密碼)。
交互式執行:傳 統的方式下,在運行java源代碼之前你必須將它們編譯為字節碼。但是使用securejsh,編譯的過程是透明完成的,所以你只需要隨意輸入一些 java表達式(就可以運行)。這意味著你可以使用你書寫應用程序時完全相同的語法,與最新的java語言規范同步。你可以在你的java項目源碼和 securejsh終端里面拷貝&粘貼任何代碼,都沒有問題。
智能命令識別,unix shell風格:不 像jsr-223(java scripting engin,java腳本引擎)對java語言的腳本的支持,在(java腳本引擎)里面你必須將java類的全部代碼輸入后才可以執行, securejsh更加智能和人性化,如果你輸入了不完整的java表達式,它會自動提示你進行多行的輸入,然后將這些表達式包裝到一個預先定義的類結構 中來執行。它是一個真正的shell。
沒有相互干擾,最小化資源消耗:securejsh沒有需要儲存在jvm范圍的靜態資源,每一個實例只消耗很少量的資源(基于nio實現,所有的ssh通訊都由一個線程處理)。你可以按照你的想法在一個jvm里面運行任意多個shell服務,包括java應用程序服務器的jvm。
作為一個開源項目,securejsh使用了ganymed的純java實現的ssh 2.0庫,并使用java nio編寫了網絡服務,代碼質量很高。據comply still介紹,securejsh最初是為內存數據庫tob設計的,為這個面向對象數據庫提供交互訪問的接口,但是后來作者發現它可以被應用在很多場合,所以單獨開源發布。作為java開發者,您可以從這里下載源碼從中學習ssh 2.0、nio網絡服務、java compiler api的使用方法,相信一定會有所收獲
新聞熱點
疑難解答
圖片精選