Pure JS (2): 热部署 (利用 JDK 7 NIO 监控文件变化)
Pure JS (2): 热部署 (利用 JDK 7 NIO 监控文件变化)
接着上一篇文章(http://xxing22657-yahoo-com-cn.iteye.com/blog/1052485)的话题,我们来谈谈服务器端 JS 的热部署问题。
由于 JavaScript 是动态语言,动态编译并执行脚本并不困难。所以关键是监控文件变化。
这里推荐使用 JDK 7 NIO 中新增的 Watch Service API。Watch Service API 将尽可能使用操作系统的文件 API ,当操作系统不支持时,则使用轮询。简而言之,就是 JNI + 轮询,自己实现轮询倒不难,但要实现跨平台的 JNI 调用就很啰嗦了。
JDK 7 还没有正式发布,可以先到这里下一个 Early Access 版 :
http://jdk7.java.net/
安装完后可以通过 eclipse 的 Window -> Preference -> Java -> Intalled JREs 添加刚安装的 JRE,并勾选为默认的 JRE 环境。
关于 Watch Service API 的使用说明可以参考这里:
http://download.oracle.com/javase/tutorial/essential/io/notification.html
前期准备
首先,我们在 src 目录下创建 purejs package ,将之前编写的 JSServer,JSEngine 和 JSServlet 都移动到这个 package 下。因为后面将会用到 import static 的写法,没有 package 名称的话会报错。
然后,我们需要在 JSEngine 类中增加执行单个文件的方法( excuteFile(File file) ),并在 excuteFiles(String dir) 方法中引用它。
现在的 JSEngine 应该是这样的:
然后就可以把这个文件和 api.js 一起删除了。
最新版的 Java 7 中,java.nio.file.StandardWatchEventKind 已改为 java.nio.file.StandardWatchEventKinds,文章已更新。
下载附件后,请将 FileChangeMonitor.java 中的 StandardWatchEventKind 改为 StandardWatchEventKinds
1 楼 lizhen1643 2011-05-24 java.nio.file.StandardWatchEventKind此类貌似已经变成
java.nio.file.StandardWatchEventKinds了 2 楼 裴小星 2011-05-24 是吗?可能版本还是不同吧。
我的版本还是 java.nio.file.StandardWatchEventKind 3 楼 裴小星 2011-05-25 下最新版看了下,果然改了。 4 楼 washheart163.com 2012-01-11 可以看看node.js 5 楼 裴小星 2012-02-23 washheart163.com 写道可以看看node.js
node.js 虽然自己的库比较全,但 Rhnio 有 Java 现有的开源资源支撑,都有各自的优势。
相对而言比较熟悉 Java,因此 Rhino 更适合我。