Java 5.0中實現JSR-223的方法

最新的java主版本(Java SE 6,又稱Mustang)現在正處于beta版本階段。雖然該版本並不像Java 5的更新那麽多,但是它確實有一些有趣的新特性。毋庸置疑,其中的一個就是對腳本編寫語言的支持。

諸如php、Ruby、javascript、Python(或Jython)之類的腳本編寫語言被廣泛應用于許多領域,並由于其靈活性和簡單性而大受歡迎。由于腳本是被解釋而不是被編譯的,所以可以輕松地從命令行運行和測試它們。這就壓縮了編碼/測試周期,並提高了開發人員的生産率。腳本通常是動態鍵入的,其語法極富表現力,所編寫出的算法要比Java中的等效算法簡明得多。使用起來通常也很有趣。

在很多情況下,從Java使用腳本編寫語言會很有用,比如爲Java應用程序提供擴展,以便用戶可以編寫自己的腳本進行擴展或定制化核心功能。腳本編寫語言可讀性更強,也更輕易編寫,所以(從技術上來說)它們是用于爲終端用戶提供根據需求定制化産品的可能性的理想語言。

早已經有許多Java可用的獨立腳本編寫包了,包括Rhino、Jacl、Jython、BeanShell、JRuby等。新消息是Java 6通過一個標准接口爲腳本編寫語言提供了內置支持。

Java 6提供對JSR-223規範的全面支持。該規範提供了一種從Java內部執行腳本編寫語言的方便、標准的方式,並提供從腳本內部訪問Java資源和類的功能。Java 6附帶了與Mozilla Rhino的Javascript 實現的內置集成。基于該規範,對諸如PHP、Groovy和BeanShell之類的其它腳本編寫語言的支持也正在進行中。本文關注的是Rhino實現,但是其它語言應該是基本相同的。

那麽如何在Java 5中使用JSR-223的實現呢? 偶經過仔細地研究, 終于找到了解決方法....

1. 幹活要從理論開始....

根據JavaDoc的說法, javax.script.ScriptEngineManager 是通過JAR規範中所謂的服務提供商(Service PRovider)方法來在庫中檢索 javax.script.ScriptEngineFactory 實現類並自動注冊的. OK, 了解了這個就好辦了, 預備開始幹活哈....

2. 開始動手幹活了.... :)

首先制作JSR-223規範實現的包(包括SUN的JavaScript默認實現):

使用WinRAR等壓縮工具打開JRE6中rt.jar文件(注重要提前備份!我的就是備份爲jsr-233.jar), 如圖1所示:

Java 5.0中實現JSR-223的方法

圖1 rt.jar的目錄結構

OK,下面開始刪除文件.... 除了com.sun.script、sun.org、javax.script、META-INF目錄之外,其余的目錄全都刪除。刪除後如下圖所示:

Java 5.0中實現JSR-223的方法

圖2 刪除後的目錄結構

目錄做好之後,下面開始按照JAR規範所描述的Service Provider方法來創建文件以便于 javax.script.ScriptEngineManager 的檢索:

·在META-INF目錄下建立一個名稱爲 services 的目錄。

·在 services 目錄中新建名稱爲 javax.script.ScriptEngineFactory 的空文件。

·在 javax.script.ScriptEngineFactory 文件中,寫入“com.sun.script.javascript.RhinoScriptEngineFactory”數據,注重不寫引號。

Java 5.0中實現JSR-223的方法

圖3 新加入的services目錄和文件

最後,將所有改動保存到jsr-223.jar文件中,工作完成!

3. 測試包

將jsr-223.jar加入到項目的庫中,然後編寫下面的代碼:

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("js");

engine.put("age", 21);

engine.eval("if (age >= 18){ " +

" print('Old enough to vote!'); " +

"} else {" +

" print ('Back to school!

JSR-223(Scripting for the Java Platform) 實現
JSR-223(Scripting for the Java Platform) 實現
  最新的java主版本(Java SE 6,又稱Mustang)現在正處于beta版本階段。雖然該版本並不像Java 5的更新那麽多,但是它確實有一些有趣的新特性。毋庸置疑,其中的一個就是對腳本編寫語言的支持。   諸如php、Ruby...查看完整版>>JSR-223(Scripting for the Java Platform) 實現
 
比較 JSR 168 Java Portlet 規範與 IBM Portlet API
本文詳細說明了 JavaTM JavaTM Standardization Request for the Java Portlet 規範(以下稱爲 JSR 168)和 IBM WebSphere Portal Version 5.0 支持的 IBM Portlet API之間的相似點和不同點。文中解釋了 JSR 168 的一...查看完整版>>比較 JSR 168 Java Portlet 規範與 IBM Portlet API
 
IBM可能會支持Java Content Repository標准JSR-170
轉自:IBM to Support Content Repository StandardFiled: 28-May-2004IBM reportedly plans to support draft Java standard "JSR 170" across all its systems. JSR 170 specifies a standard Java API to access ...查看完整版>>IBM可能會支持Java Content Repository標准JSR-170
 
JSR 224-Java EE 5 最終草案發布
  Sun 最近提交了JSR 224-Java EE 5的 最後草稿。    Java EE 5 最要害的地方,就是開發將更加簡易,將更關注小到中型系統的開發。    JSR-244規定了Java EE 5總體框架下需要具備的技術特性,其中的各項技...查看完整版>>JSR 224-Java EE 5 最終草案發布
 
Mobile Java 3D(JSR-184)集成快照功能
z1010型號以後所有索尼-愛立信非Symbian操作系統的MIDP2.0手機都能夠支持攝像頭快照API。通過答應用戶配置應用程序的外觀和遊戲視角,這個API爲Java開發者提供了更多的選擇可能。舉個例子,假如用戶用攝像頭照了一張...查看完整版>>Mobile Java 3D(JSR-184)集成快照功能
 
在Java編程語言中實現UDP協議編程的方法
什麽是UDP協議 UDP協議的全稱是用戶數據報,在網絡中它與TCP協議一樣用于處理數據包。在OSI模型中,在第四層——傳輸層,處于IP協議的上一層。UDP有不提供數據報分組、組裝和不能對數據包的排序的缺點,也就是說,當...查看完整版>>在Java編程語言中實現UDP協議編程的方法
 
Java中Decorate的三種實現方法
  每一位讀過GoF的那本聞名的設計模式一書的人都會知道Decorator模式。現在,讓我們暫時忘記所了解的Decorator概念,嘗試著從我們的開發經驗中去理解Decorator模式吧。  Decorator是用于裝飾一個事物(或人)的另...查看完整版>>Java中Decorate的三種實現方法
 
如何在Java中實現遠程方法調用
一、Java中的遠程方法調用 遠程方法調用(Remote Method Invocation, RMI)是Java1.1引入的分布式對象軟件包,它的出現簡化了在多台機器上的Java應用之間的通信。相比CORBA,RMI功能較弱且只能用于Java系統。 二、實...查看完整版>>如何在Java中實現遠程方法調用
 
在Java中實現UDP協議編程的方法
UDP協議UDP協議的全稱是用戶數據報,在網絡中它與TCP協議一樣用于處理數據包。在OSI模型中,在第四層——傳輸層,處于IP協議的上一層。UDP有不提供數據報分組、組裝和不能對數據包的排序的缺點,也就是說,當報文發送...查看完整版>>在Java中實現UDP協議編程的方法
 
 
回到王朝網路移動版首頁