抱怨过了,街也骂过了(第一篇,第二篇,第三篇,第四篇)。那么重要的是我们其实需要解决问题。
在node.js的压力下,个人选择jvm上内嵌类似nodejs的js容器作为思路与方向。事实上,这种东西java也早有了。rhino,rhino可能是最早在服务端运行js之一,而且早在java1.4时期就是我就尝试用过,java6变成java标准实现的一部分。但是对比nodejs的npm,他的周边库少的可怜。
nodejs为何有如此强大的社区,这要归功于common-js标准以及npm社区库。这让nodejs开发模块部署非常便利。
okok。nodejs的优势是这个。其实呢jvm上也有符合common-js标准的实现。
那就是:
RingoJs:ringojs.org
Vertx:vertx.io
其中vertx更是号称在jvm上替代nodejs的实现,支持多种语言。
然而,对于这两个平台(姑且这么说)。其官方默认推荐方式,都是整体js化。即,用户撰写包括httpserver在内,均使用js写一遍,main入口也用js完成。这种方式与单独使用nodejs用法一样,只是他们可以引用一些java类之类进行一些功能扩展。
另一方面传统java应用开发已经由来已久,最典型的标准就是java web标准如servlet,开发人员以及企业已经投入大量的经理进行构建。
如果在使用时还需要完全用新的代码重写以前本来由webserver提供的功能,真的很无法接受。那么其实我们要的是既能够使用js-scripting带来的便利易用,同时有保护已有的资产,复用java的已有资源且主要是框架资源,webserver(weblogic等)、静态框架或容器(spring等)。
也许将js-scripting 引擎容器嵌入已有的javaweb-app是比较能够接受的用法。
选型:
ringo 较为轻量实现,但是其需要依赖rhino独立包而不是jdk内置的版本。且其比较贴近common-js标准。
vertx是nodejs的复刻,功能较多相对跟活跃,且已经进入eclipse开源社区。当然其对common-js支持与nodejs类似,不算很标准。其需要java7版本的内置scripting机制。
然而在我之前浏览其各自的开发过程时,vertx支持多语言实现,文档中有一句:
If you are embedding this way you should be aware that
- You will only be able to use Vert.x with Java, not any of the other languages that Vert.x suppports.
这让我相当无语。也就是说,其嵌入java中后无法使用其他语言????(我并没有深入了解vertx,希望各位大大能提供一个解决办法,集成vertx是最好的选择。)
既然如此,首先选择ringojs作为js容器嵌入已有java应用的切口。果然轻量有轻量的好处,ringo的jsgi实现与JsgiServlet提供了很好的集成样例。
后续通过ringo的学习以及尝试建立自制的功能扩展来完成java与ringo的集成的样例。