动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.精通语言不等于是一个好的软件开.
.用JBuilder9 开发Struts实例.
.关于游戏中高效的换色方法.
.JADT 入门,第 1 部分.
.深入理解Collections API.
.java文件的相对路径.
.DeleteFile 方法.
.带图片的,多列的DropDownList的.
.Java常用的加密 解密 数字签名等.
.从File类开始IO系统介绍.
.Junit 的使用经验总结.
.关于mysql5改密码后不能登录问题.
.spring快速入门教程.
.关于Date和Calendar类的基础用法.
.iPlanet 6.0综合介绍.
.成员函数的说明和使用.
.Java内存溢出导致服务器死机之应.
.找回丢失的源代码.
.使用JDBC连接SYBASE的3种方法.
.NaN 属性 (Global).

企业应用级别的Ant模组编译环境

发表日期:2008-1-5 |



  编译环境对于今日的Java企业级应用程序来说,越来越难于治理了。堆积如山的代码,配置文件,以及对第三方的依靠(third-party dependencies)都使得治理编译环境变得困难。
  
  简而言之,我们勉强接受那种把所有的源代码放在一个根目录下,所有的配置文件放在另一个根目录下,而第三方类库也这样处理的做法。但是企业级编译环境很少这么做。今日的企业级Java项目,在结构,功能,以及组织上都很复杂。它们通常都有大量的源代码和支持资源(属性文件,图片,等等。编者注:原文为supporting artifacts,直译为支持物件,但这里根据上下文意译为支持资源较妥)要去治理。有这么多的东西去治理,当一个开发团队试图去建立一个优化的编译方案时,他们经常感到困惑和挫败。
  
  假如,不管这个项目有多大,我们的编译环境都能够在统一的构架中简洁地处理我们所有的源代码,事情是不是会变得好一些呢?本文将展示一个Ant编译环境的例子,它来自我对多年来的多个项目的经验的修改。此时此地,它或许不是最好的方案,但是它的确经历了时间的考验,也一定会帮助你建立并运行在大多数项目上,不管是大是小。
  
  警告
  
  先就一些问题说明一下,这样你就不会读完了这篇文章才发现它对你没有任何价值:
  
  · 本文基于对Ant的了解。它是针对那些会用并喜欢Ant的读者的。
  
  · 这里所说的编译环境是指模组(modular)和模块(module),而模块又是由目录和子目录来定义的。(译者注:模组modular是模块module的集合。它由多个独立的模块构成。)这意味着文件和源代码被存放在许多不同的目录中。因此,假如你使用类似Eclipse或IntelliJ Idea这种可以帮你治理类和文件的位置的IDE工具的话,本文对你会更加有益。当然,你也可以使用文本编译器,但是恐怕你会发现你频频地在多棵“目录树”上爬上爬下。
  
  概念
  
  首先,让我们来谈及掉隐藏在编译环境之后的几个核心概念。它们是模组,层级结构(hierarchical),和资源驱动(artifact-driven)。它们确切的含义又是什么呢?
  
  模组
  
  模组编译是指围绕软件模块来进行组织的一种编译方式。一个模块是一个逻辑的,集合的,功能性单元,对应于系统中的一个特性。对于编译环境而言,一个模块表现为源代码和配置文件的一个自我包含集合(self-contained collection),这些源代码和配置文件用来构建表现了模块所对应的那个命名特性的软件。它几乎和你修订控制系统(RCS:Revision Control System)(例如CVS或者Subversion)中的目录树是一一对应的。举几个例子:security, administration, wiki, email都可以是一个模块。
  
  层级结构
  
  层级结构编译是指含有分层模块的编译方式。也就是,对于一个模块,它可能是由更小的,更特定的子模块(submodule)来构成的。
  
  假如一个模块含有子模块,那么它有责任保证那些子模块以合适的方式被编译。
  
  随后,我们会讨论例子是如何应用层级结构的概念来建立编译环境的。
  
  物件驱动
  
  物件驱动编译是指每个存在的模块(module)或子模块(submodule),都是为了产生一个单独的,可部署的物件。在Java项目中,这些物件主要是.jar,.war,或.ear文件。在其他类型的编译中,它们通常是二进制可执行文件或动态连接库(.dll或.so)。
  
  编译环境的例子也是物件驱动的,我们将会讨论它是如何创建可部署的物件的。
  
  尽管这三个概念都很轻易理解,但结合起来用在编译环境中的话,它们会变得非常强大。
  
  现在让我们来看看编译环境是如何组织的。
  
  模组结构
  
  当有很多要去实现的时候,把问题分解为若干个小的部分是个很有效的方法。我们需要一个好的分而治之(divide-and-conquer)的技术来帮助我们来治理大量的源码。在编译环境中创建编译模块是个好方法。
  
  我们通过在应用程序的根目录下创建一个目录来创建一个模块。这个新的目录成为这个模块的基础。在每个模块目录下,我们存放与其相关的文件和源码。
  
  这是一个示例程序的编译环境,按照模块来组织:
  
  appname/
  -- admin/
  -- core/
  -- db/
  -- lib/
  -- ordermgt/
  -- reports/
  -- web/
  -- build.XML
  
  下面是每个节点的含义:
  
  · 除了lib/ 以外的每个目录都是一个模块。在这个例子中,admin模块提供了POJO的实现,它容许某人来治理应用(例如,创建用户,授权等等)。同样的,reports模块中,有能够产生报告的组件的实现。而core 模块中是那些在很多或全部模块中都用到的组件,它们不是真正地和系统的某个功能相联系。(例如,StringUtil 类)通常,其他地所有模块都会依靠核心(core)模块。
  
  其他模块与admin, reports, 及core模块一样:他们有着各自的自包含的系统功能,并与其他模块区别开来。此外,由于我们的范例应用可以支持基于web的交互,我们还可以有一个web模块,包含了用以创建一个.war文件所需要的一切内容。
  
  · lib/ 目录比较非凡。它含有应用程序编译或运行所需地所有第三方.jars文件。我们把其他模块所需的所有第三方.jars文件放在这个目录中,而不是它们自己的模块中。原因如下:
  
  1. 在一个地方更便于治理对第三方的依靠(third-party dependencies)。可以在一个模块的build.xml 文件中,利用Ant的<path> 语句来定义改模块是否使用这些库文件。
  
  2. 通过排除重复.jars文件的可能性,从而避免了装载类或API的版本冲突。假如有不止一个模块使用了一个负责存储commons-logging.jar文件的Jakarta Commons Logging模块,会发生什么情况?假设每个模块都持有Jakarta Commons Logging模块的备份,这样就会有一个潜在的问题――一个模块所持有的备份和另外一个模块所持有的版本不同。当应用程序开始运行,只有第一个在classpath上找到的.jar文件被载入以满足所需,这就潜在地引起了与其他模块的冲突。我们通过在根目录下只持有一个.jar文件来避免这种冲突。
  
  3. 对第三方的依靠随你的源码改变版本。浏览很多项目,会发现,这是你想把你所依靠的库文件放在CVS上的最重要原因。通过这样做,你能确保,无论你从CVS上导出的是那个版本或那个分支的软件,你都能找到第三方类库的合适版本来支持你的软件的特定版本。
  
  · 根build.xml 文件是主要的治理文件。它知道为了编译每个模块,什么文件和目标(target:译者注,应该是<target>,是Ant中的一个语句)是必须的。然后,由模块来保证这些物件(artifact)被正确的编译。
  
  例如,假设一个项目正在编译,现在是编译ordermgt 模块的时候了,根编译文件(root build file)应该知道,去调用ordermgt/build.xml 文件中一个Ant任务来完成这编译。而ordermgt/build.xml 文件应该确切的知道要编译生成ordermgt .jar 文件需要些什么。而且,假如整个项目被编译并合并入一个.ear文件,这个根build.xml 文件应该知道如何去构建。
  
  根build.xml 文件是怎么知道要去编译一个模块并且以何种顺序来编译的呢?下面是一个Ant XML文件的一部分,它显示了build.xml文件是如何完成设定的目标的:
  
  <!-- =========================================   Template target. Never called eXPlicitly,   only used to pass calls to underlying   children modules.   ========================================= --> <target name="template" depends="init">  <-- Define the modules and the order in which     they are executed for any given target.     This means _order matters_. Any     dependencies that are to be satisfied by    one module for another must be declared     in the order the dependencies occur. -->  <echo>Executing "${target}" \       target for the core module...</echo>  <ant target="${target}" dir="core"/>  <echo>Executing "${target}" \      target for the admin module...</echo>  <ant target="${target}" dir="admin"/>  ...</target>
  
  无论根build.xml 文件调用了哪个编译目标,都由这个template 目标负责以一定的顺序传递给相应的子模块。例如,假如我们想要清理整个工程,我们应该只需在工程的根部调用clean 目标即可,然后下面的任务将被执行:
  
  <!-- =========================================   Clean all modules.   ========================================= --><target name="clean" depends="init">  <echo>Cleaning all builds"</echo>  <antcall target="template">    <param name="target" value="clean"/>  </antcall></target>
  
  根build.xml 文件通过直接调用template 目标来间接地实现调用clean 目标,从而保证了所有模块都被清理。
  
  上面的模块组织和相关的编译目标真地使治理源码和编译变得更轻易了。这种结构有助于你更快,更轻易地找到你想要的源码。而template 目标负责治理任务是如何执行的。
  
  但模块结构最出色的部分是这里:
  
  在完成了整个工程的完整编译后,可以对任何模块进行独立的编译。只要在命令行中切换到该模块目录下,并执行:
  
  > ant target
上一篇:开发方法及软件工程之ANT之文件操作 人气:679
下一篇:在Eclipse中使用Ant来自动编译J2me程序 人气:1326
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成