在项目的介绍中可以得知,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的使用方法,相信一定会有所收获。
新闻热点
疑难解答