JRuby Velocity
2007年1月19日
昨天我需要使用 Velocity 来探索一些关于模板和宏的东西。我喜欢 Velocity 的简单模板语言,但这次我并没有在 Java 或 .NET 工作中使用它。在这种情况下,使用 Velocity 会有点麻烦,因为你必须在 Java 中设置上下文并运行处理器。
这种情况需要一种脚本语言,我首选的脚本语言是 Ruby,因此我认为这是一个尝试 JRuby 的好机会。我的结论是它运行得很好,但我不会让你厌烦细节。
我下载了 JRuby 并将其解压缩到 /usr/local/lib
中,并创建了一个符号链接,以便我可以通过 /usr/local/lib/jruby
访问它。
然后,我在 /usr/local/bin
中放置了一个简单的重定向 shell。
JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun JRUBY_HOME=/usr/local/lib/jruby /usr/local/lib/jruby/bin/jruby "$@"
然后我就可以运行 JRuby 了。
$ jruby -v ruby 1.8.5 (0) [java]
(实际上,我花了很长时间才让它工作,最终我在椅子和键盘之间找到了错误。我太尴尬了,不想告诉你是什么。)
要运行 Velocity,你必须将其添加到 JRuby 的类路径中。
CLASSPATH=path/to/velocity-dep-1.4.jar export CLASSPATH jruby "$@"
为了帮助运行 Velocity,我编写了一个小助手类。
require 'java' class VelocityLauncher def initialize context, template @context = context @template = template end include_class 'org.apache.velocity.app.Velocity' include_class 'org.apache.velocity.VelocityContext' include_class 'java.io.StringWriter' def run vc = VelocityContext.new(@context) writer = StringWriter.new Velocity.init Velocity.evaluate(vc, writer, "LOG", @template) return writer.getBuffer end end
现在我可以编写一个小的模板
This is an announcement from $host Our chief weapons are: #foreach ($w in $weapons) - $w #end
要填充它,我只需要一个 Ruby 哈希,这很容易创建。
ct = {'host' => 'Cardinal Fang', 'weapons' => ['Fear', 'Surprise', 'Ruthless Efficiency']} template = File.readlines('template.txt').join puts VelocityLauncher.new(ct, template).run
我可以想象将它扩展为一个不错的 Velocity 命令行运行器,它将接受以下形式的上下文文件:
host = 'Cardinal Fang' weapons = ['Fear', 'Surprise', 'Ruthless Efficiency']
但我现在还不需要它,所以我会在另一天完成它(而且我很确定“另一天”的绑定是什么)。