來源:互聯網網民 2008-05-31 12:11:04
評論最新的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所示:
圖1 rt.jar的目錄結構
OK,下面開始刪除文件.... 除了com.sun.script、sun.org、javax.script、META-INF目錄之外,其余的目錄全都刪除。刪除後如下圖所示:
圖2 刪除後的目錄結構
目錄做好之後,下面開始按照JAR規範所描述的Service Provider方法來創建文件以便于 javax.script.ScriptEngineManager 的檢索:
·在META-INF目錄下建立一個名稱爲 services 的目錄。
·在 services 目錄中新建名稱爲 javax.script.ScriptEngineFactory 的空文件。
·在 javax.script.ScriptEngineFactory 文件中,寫入「com.sun.script.javascript.RhinoScriptEngineFactory」數據,注重不寫引號。
圖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!
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
最新的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所示:
[url=/bbs/detail_1760693.html][img]http://image.wangchao.net.cn/it/1323504278442.jpg[/img][/url]
圖1 rt.jar的目錄結構
OK,下面開始刪除文件.... 除了com.sun.script、sun.org、javax.script、META-INF目錄之外,其余的目錄全都刪除。刪除後如下圖所示:
[url=/bbs/detail_1760693.html][img]http://image.wangchao.net.cn/it/1323504278731.jpg[/img][/url]
圖2 刪除後的目錄結構
目錄做好之後,下面開始按照JAR規範所描述的Service Provider方法來創建文件以便于 javax.script.ScriptEngineManager 的檢索:
·在META-INF目錄下建立一個名稱爲 services 的目錄。
·在 services 目錄中新建名稱爲 javax.script.ScriptEngineFactory 的空文件。
·在 javax.script.ScriptEngineFactory 文件中,寫入「com.sun.script.javascript.RhinoScriptEngineFactory」數據,注重不寫引號。
[url=/bbs/detail_1760693.html][img]http://image.wangchao.net.cn/it/1323504278933.jpg[/img][/url]
圖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!