`
sean_gao
  • 浏览: 230096 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

When ANT is not enough, JRuby to the rescue!

阅读更多

随着项目越来越大,你的ANT脚本变得越来越臃肿,越来越依赖antcontrib来实现构建逻辑?不想放弃对构建过程和产出做精细的控制?恨不得自己写ANT Task?
等一等,在你考虑转向Maven或者真正卷起袖子开始研究ANT Task的API之前,先听我向你推荐Ruby/JRuby。相信我,也许这才是你真正需要的。

在我看来构建脚本最主要的要求是表达能力和控制能力,表达能力是我们应该能够很方便的告诉它我们要它做什么,而控制能力是我们告诉它如何去做,除了必要的构建命令的参数、依赖关系之外,它应该能够理解我们其他一些特殊要求。在项目相对简单时,ANT的XML格式的"脚本语言"能够比较好的表达构建者的要求,至少比纯Java的方式更加简单清晰,于是几乎从它诞生之日就成为Java领域当仁不让的头号构建工具。但是ANT也有它不够用的时候,尤其在控制能力上,为了实现实际使用中越来越复杂越来越精细的对构建过程和产出的要求,ANT的使用者们开始对ANT进行扩展,最具影响力的"非官方"扩展可能就是antcontrib了,很多实际Java项目的构建文件中我们都能够找到它的影子。但是一堆taskdef和<for><if><variable><substring><stringutil><length><math>之类的夹杂在ANT脚本里,怎么看怎么觉得别扭,也严重影响构建脚本的可读性。

我发现我需要的是一个具有完整功能脚本语言来写我的构建逻辑:一方面它要足够简单,我需要清晰的表达我的意图,另一方面当我需要的时候它要足够强大来帮我实现精细的控制。我自然而然想到Ruby。

由于Ruby是一个功能完整的工具,完全自己写Ruby脚本来调用Java自己的构建工具如javac、jar等等并非不可能,但是既然已经有人做了轮子,我们拿来用就是了,大不了自己再改装一下,也少走些弯路。时下比较流行的解决方案有Buildr、Raven、Rant和Antwrap,它们各有特点,大家可以根据需要进行选择。

我最终选了其中最"轻量"的Antwrap,原因嘛,我不想学新的API,我已经熟悉ANT常用的Task,而且我希望尽可能多的自己控制构建的过程和产出。Antwrap最能够满足我的需要。而前不久JRuby刚刚发布了1.0版,这样一来Ruby和Java的跨界引用变得更加容易,Ruby的实现自然就选择了JRuby。

安装JRuby和Antwrap相当容易,只要把下载的jruby-bin-1.0.tar.gz/.zip解压到本地,确保JAVA_HOME和CLASSPATH的配置,然后gem install Antwrap (选择Java版) 即可。为了顺利加载Antwrap,需要在CLASSPATH中包含ANT的ant.jar和ant-launcher.jar。(当然,如果想更加方便的share你的成果,可以把ant的文件拷贝到jruby目录下,在jruby的启动脚本加入必要的export/set命令,然后打包,这样别人只要从你提供的zip包解压出来即可使用。)

为了给大家一个直观的感觉,举个简单的例子:
ruby 代码
 
  1. require 'rubygems'  
  2. gem 'Antwrap'  
  3. require 'antwrap'  
  4.   
  5. @ant=AntProject.new(:name=>"SampleAntwrapBuild":basedir=>".")  
  6. @cvsroot=":pserver:cvsuser:password@10.10.10.1/cvsrepo/SampleProduct"  
  7.   
  8. def cvscheckout  
  9.     @ant.cvs(  
  10.         :cvsroot=>"#{@cvsroot}",   
  11.         :command=>"checkout -A",   
  12.         :package=>".",   
  13.         :dest=>"cvsoriginal",   
  14.         :compressionlevel=>"9")  
  15. end  
  16.   
  17. def cvsupdate  
  18.     @ant.cvs(  
  19.         :cvsroot=>"#{@cvsroot}",   
  20.         :command=>"update -A -d",   
  21.         :package=>".",   
  22.         :dest=>"cvsoriginal",   
  23.         :compressionlevel=>"9")  
  24. end  
  25.   
  26. def compile(project_name)  
  27.     @ant.javac(  
  28.         :srcdir=>"cvsoriginal/#{project_name}/src",   
  29.         :destdir=>"cvsoriginal/#{project_name}",   
  30.         :target=>"1.5",   
  31.         :encoding=>"GBK")  
  32.     @ant.copy(  :todir=>"cvsoriginal/#{project_name}"do  
  33.         fileset(:dir=>"cvsoriginal/#{project_name}/src"do  
  34.             exclude(:name=>"**/*.java")  
  35.         end  
  36.     end  
  37.     @ant.jar(  
  38.         :destfile=>"build/#{project_name}.jar",   
  39.         :basedir=>"cvsoriginal/#{project_name}",   
  40.         :manifest=>"MANIFEST.MF"do  
  41.         exclude(:name=>"src/**")  
  42.     end  
  43. end  
  44.   
  45. # to actually call your target  
  46. if ARGV.empty?  
  47.     puts "Usage: jruby #{$0} [target]"  
  48. else  
  49.     eval ARGV[0]  
  50. end  

可以看到几乎都是我们熟悉的ANT Task,只是更加紧凑更加灵活,一旦掌握了最最基本的Ruby语法,用它写出功能强大的构建脚本可以说是分分钟搞定。
分享到:
评论
2 楼 sean_gao 2007-06-18  
呵呵,举的例子本来就只是为了消除不熟悉Ruby语法的朋友的一些疑虑,因为你几乎能够重用你在ANT上的所有投资,其实包括antcontrib也能够以这样的方式使用,只是有了Ruby和直接调用Java API的功能之后,antcontrib我个人觉得没什么用武之地了,例子中并没有出现特别Rubyish的东东。

当你面对的数十个除了路径和项目名称本质上类似,但需要动态的创建manifest、jnlp,动态读取项目中某些信息影响最终产出的jar文件名(比如在文件名中显示版本号)时,单纯的ANT或者加上antcontrib的ANT就会变得异常臃肿。

当然也有一个基本的前提,我向大家推荐JRuby/Antwrap,并非说ANT有什么事情做不到,只是我觉得JRuby/Antwrap能够让我比ANT更加清晰高效的表达对构建过程和产出的具体要求。
1 楼 Sam1860 2007-06-18  
觉得只是作为ANT的另一种语法选择,并不觉得有比XML方式强大,灵活

相关推荐

    jruby1.7.8版本呢

    **JRuby 1.7.8 版本详解** JRuby 是一个开源的、高性能的 Ruby 解释器,它能够将 Ruby 代码编译成 Java 字节码,从而在 Java 虚拟机(JVM)上运行。JRuby 的出现使得 Ruby 开发者能够利用 JVM 的强大功能和丰富的库...

    jruby-src-1.0

    标题“jruby-src-1.0”指的是JRuby的一个特定版本——1.0的源代码。JRuby是一种实现Ruby编程语言的Java版本,它允许在Java平台上运行Ruby代码,同时也支持与Java应用程序进行无缝集成。这个压缩包“jruby-src-1.0....

    jruby-dist-9.1.15.0-bin.zip

    It is expected to be compatible with Ruby 2.3.x and stay in sync with C Ruby. JRuby 9.1.15.0 is our latest release… Major features of JRuby 9000: Ruby 2.x compatibility A new optimizing runtime ...

    org.jruby.rar

    标题 "org.jruby.rar" 暗示我们正在讨论一个与 JRuby 相关的压缩文件,其中可能包含了 JRuby 的源代码、库文件或者其他相关资源。JRuby 是一种 Java 实现的 Ruby 解释器,它允许 Ruby 代码在 JVM(Java 虚拟机)上...

    如何安装与配置JRuby

    **JRuby 安装与配置指南** JRuby 是一个基于 Java 平台的 Ruby 实现,它允许开发者利用 Ruby 语言的优势同时享受 Java 生态系统的强大功能。在本文中,我们将详细探讨如何安装和配置 JRuby,特别是针对 JRuby 1.1.2...

    jruby-bin-1.3.1.zip

    JRuby是Java平台上的一个实现,它允许开发者在Java虚拟机(JVM)上运行Ruby编程语言。这个“jruby-bin-1.3.1.zip”压缩包是JRuby的一个早期版本,专为Ruby语言的研发提供必要的工具和环境。在这个版本中,重点是兼容...

    jruby-dist-9.1.15.0-bin.tar.gz

    It is expected to be compatible with Ruby 2.3.x and stay in sync with C Ruby. JRuby 9.1.15.0 is our latest release… Major features of JRuby 9000: Ruby 2.x compatibility A new optimizing runtime ...

    jruby_windows1.7and bin1.7

    jruby安装包 和 jruby的lib库 JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。Rails彻底加快及简化了Web应用的开发,不过它让...

    jRuby On Rails WEB2.0

    《jRuby on Rails WEB2.0》:将Ruby on Rails融入Java平台的实践指南 《jRuby on Rails WEB2.0》是一部由Ola Bini撰写的书籍,深入探讨了如何将Ruby on Rails这一敏捷开源框架与Java平台相结合,以构建高效、灵活的...

    Netbeans 6.0 JRuby on Rails 演示 .swf

    Netbeans 6.0 JRuby on Rails 演示 .swf

    jruby_windows_1_6_4安装文件

    **JRuby:Ruby on Windows的完美融合** JRuby是一个开源的、基于Java平台的Ruby语言实现,它允许开发者在Ruby环境中使用Java类库,并且可以让Java应用程序无缝地调用Ruby代码。标题中的“jruby_windows_1_6_4安装...

    如何监控JRuby脚本的执行

    在IT行业中,尤其是在Java与Ruby混合开发的场景中,JRuby是一个重要的工具,它允许开发者在Java平台上运行Ruby代码。由于JRuby是基于JVM(Java Virtual Machine)的,因此可以利用Java生态中的各种工具来对其进行...

    jruby-1.3.1.jar

    jruby-1.3.1.jar包 解决org.jruby.exceptions.JumpException 等报错

    Ruby-JRuby一个Ruby语言的Java实现

    JRuby的版本"jruby-jruby-7bee00d"可能是一个特定的Git提交版本,这表明它是一个开发版本,可能包含了最新的功能和改进。通常,这样的版本会包含一些实验性的特性,对于开发者来说,他们可以提前试用新功能并提供...

    jruby-complete-1.7.19.jar

    jruby-complete-1.7.19.jar,java版本的ruby解析器

    jruby-1.5.5+OperaWatir+RSpec

    标题 "jruby-1.5.5+OperaWatir+RSpec" 暗示了这是一个关于使用 JRuby 1.5.5 版本、OperaWatir 和 RSpec 进行自动化测试的项目或者资源集合。现在,我们将深入探讨这三个关键组件以及它们在 IT 领域中的应用。 JRuby...

    JRuby window X64 开发软件

    JRuby window X64 开发软件

Global site tag (gtag.js) - Google Analytics