|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。j2ee|项目编者语:在这本书中,PragmaticProjectAutomation,MikeClark为你供应了一无所有的办法来主动化你的软件项目:用Ant来一步式构建(one-stepbuilds),用CruiseControl按企图工夫来延续构建(schedulingcontinuousbuilds),按一下按钮就能够公布软件,容易地安装和布署使用,经由过程email,RSS,你的手机,乃至是熔岩灯(lavalamps)来监控构建和程序运转。办法包括示例使初学者也很简单理论,即便是生手也有更多初级的主题能教她们一些新工具。在这篇文章里,他刻画了主动化你的项目能带来的优点的提要。
你行将要在今天早上托付一个用于关头性演示的软件版本。穿戴西装的发卖职员嘴里吹着泡夸耀你公司的新的帮助使用给一些非常主要的有钱人。正象你正在键盘上寻觅感到,你的老板却站到你的中间提示你这个演示大概会失掉这个项目大概让项目垮台。不要有任何压力!
一步构建和测试
在你为那些“必需有”的演示特性输出最初一行代码后,差未几都午时了。你最喜好的IDE显现你的代码编译经由过程并经由过程了单位测试。可是当他分离到体系的其他部分,你的代码是不是能象预期的那样一般事情呢?为了弄分明它,你更新了你当地的事情区,为了同步如今版本把持体系中的文件。然后你运转了项目标一步式构建历程:
$ant
这个命令编译了一切的代码文件,运转了上面Ant构建文件中的设置的一切的单位测试。
清单1:
<projectname="whizbang"default="test"basedir=".">
<propertyname="build.prod.dir"location="build/prod"/>
<propertyname="build.test.dir"location="build/test"/>
<propertyname="src.dir"location="src"/>
<propertyname="test.dir"location="test"/>
<propertyname="vendor.lib.dir"location="vendor/lib"/>
<pathid="project.classpath">
<pathelementlocation="${build.prod.dir}"/>
<pathelementlocation="${build.test.dir}"/>
<filesetdir="${vendor.lib.dir}">
<includename="*.jar"/>
</fileset>
</path>
<targetname="prepare">
<mkdirdir="${build.prod.dir}"/>
<mkdirdir="${build.test.dir}"/>
</target>
<targetname="compile"depends="prepare">
<javacsrcdir="${src.dir}"destdir="${build.prod.dir}">
<classpathrefid="project.classpath"/>
</javac>
</target>
<targetname="compile-tests"depends="compile">
<javacsrcdir="${test.dir}"destdir="${build.test.dir}">
<classpathrefid="project.classpath"/>
</javac>
</target>
<targetname="test"depends="compile-tests">
<junithaltonfailure="true">
<classpathrefid="project.classpath"/>
<formattertype="brief"usefile="false"/>
<batchtest>
<filesetdir="${build.test.dir}"
includes="**/*Test.class"/>
</batchtest>
</junit>
</target>
</project>
当你写代码时,你在你的IDE中频仍地址击便利的构建按钮来确认一切的工具都编译了。你也已热中于当你的JUnit测试经由过程后,看到一个康乐的绿色条(单位测试乐成的标记),然后你利用JUnit测试运转器(JUnittestrunner)整合到你的IDE中。但不是团队里的每一个人都象你那样喜好这个IDE,并且你也不想在每次有人想做一个构建时就不能不启动IDE。利用构建文件来和你的IDE分别,每一个团队里的人都能一步式地延续构建和测试项目。(项目利用Maven来创立一步式构建。)
你不要惊奇,构建乐成了,你再次意想到你是天下上最巨大的程序员。不但是在代码里做这个构建历程带给你的信念,他也让你对项目可在你的IDE外构建有信念。
感到十分好,你上传了已变动的文件并避开了那些贫苦。为了筹办演示,你仍然有很多要做的,你必要更早的分开第一次往列入你儿子的tee-ball游戏竞赛。时钟滴答的响着…
泡泡危急
午餐后回办公室的路上,你注重到项目标白色熔岩灯在沸腾(这类灯灯罩里有特别液体质料)。哦!当你想分开往用饭的时分,绿色的灯正愉快的冒着泡(申明程序统统一般)。你分开后,你项目标按企图举行的构建历程在呆板上勉力的实验构建和测试如今版本把持资本(versioncontrolrepository)上的代码。但产生了可骇的毛病。
让你的项目一连地运转构建是很简单的,由于实践上你能够在命令行中一步就创立一个构建。这意味着你能够很简单的让一台盘算机全日地为你运转构建。不然,你就不能不放一个开辟职员不时地用命令行构建文件。取而代之,你用CruiseControl设定在你的项目公用构建呆板上在必定的工夫距离内主动地创立构建,以下面的config.xml文件所示:
清单2:
<cruisecontrol>
<projectname="whizbang"buildafterfailed="false">
<bootstrappers>
<currentbuildstatusbootstrapper
file="logs/whizbang/currentbuildstatus.txt"/>
</bootstrappers>
<modificationsetquietperiod="30">
<cvslocalworkingcopy="checkout/whizbang"/>
</modificationset>
<scheduleinterval="300">
<antbuildfile="cc-build.xml"/>
</schedule>
<logdir="logs/whizbang">
<mergedir="checkout/whizbang/junit-results"/>
</log>
<publishers>
<currentbuildstatuspublisher
file="logs/whizbang/currentbuildstatus.txt"/>
<!--emailpublisher-->
<!--RSSpublisher-->
<!--lavalamppublisher-->
</publishers>
</project>
</cruisecontrol>
这个config.xml文件使CruiseControl每5分钟被叫醒一次,检测你项目标CVS资本,看看是不是必要构建。只要当你的团队中有人变动了一个已存在的文件,大概到场了一个新文件到版本把持资本里的时分,CruiseControl才实验往创立一个构建。他依附于如何用一个Ant大概Maven构建文件为你的项目往创立一个构建。你能够用CruiseControl设定往运转一个叫cc-build.xml的Ant构建文件,内容以下:
清单3:
<projectname="cc-build"default="build"basedir="checkout">
<targetname="build">
<deletedir="whizbang"/>
<cvscommand="cowhizbang"/>
<antantfile="build.xml"dir="whizbang"/>
</target>
</project>
cc-build.xml文件经由过程删除你项目在前次构建时的拷贝和从CVS资本高低载一个项目新的拷贝引诱运转构建历程。然后他主动运转一样的你在命令行中编译和测试项目标bulid.xml文件。在运转build文件后,CruiseControl公布构建了局给一切注册了的刊行人。(利用Maven的项目也用了CruiseControl,不外它被谁设定用一些你不喜好利用的别的的版本把持体系往监督变更)
每5分钟把这些事情全都做一遍是个轻松的事情,这就是为何你喜好让CruiseControl来为你做这些。当你最后设置它的时分,看起来十分贫苦,但你已学会感谢能合时回馈给你信息的代价。5分钟的企图义务不外是编译了一切的代码和运转了单位测试,作了一个快速的健全性的检测。你也用CruiseControl设置往运转一整套体系在不那末频仍的工夫距离里实行测试。假如5分钟构建失利了,那成绩不会存在凌驾了5分钟。这就让你对照简单的查找和修复成绩,从而勤俭了你可贵的工夫。假如在比来的5分钟里,没有变更被提交,那末CruiseControl坚持休眠。
看,构建失利了!CruiseControl扑灭了白色熔岩灯是件功德,由于你大概疏忽了你装满了邮件的收件箱里的构建失利的email。发急找到成绩的本源,你翻开了构建形态web页发明匆仓促间你忘了上传一个新文件。这很难为情,但最少你如今能更早的修复构建在演示前在成绩庞大起来招致一个恶梦般的调试集会之前。
疾速公布
不久今后,团队里的每一个人都上传了他们的代码。如今你筹办创立一个分发文件部署它到演示的服务器上。但在动身之前你只剩了未几的工夫,公布历程包含了以下单调有趣的步骤:
1.测试在骨干路径中的代码
2.在版本把持上建一个版天职支
3.校正版天职支的内容
4.构建和测试版天职支中的代码
(修复一切的成绩)
5.打包这个版本的一切的文件到一个分发文件里
6.测试分发文件中的内容
7.把版本把持中的版天职支作上标签
8.把分发文件发给QA
这只是你能想起来的步骤!实践上,公布你的软件老是一个耗时的易产生毛病的历程。因而,你不克不及常常的公布你软件的新版本。你对不能不回想公布过程当中的一切步骤和不能不准确的输出一切必要的命令的压力感应怠倦。如今你的项目一步步的公布历程都是主动的(乃至备有文档)依附着一些按钮操纵般的公布剧本。
演示将要消费一点筹办,你想要一个和程序骨干上活泼部分开离的不乱的事情区。但你又不想鄙人一个版本公布前解冻骨干堵塞每一个人的开辟。办理计划就是在你的版本把持资本里创立一个版天职支。第一个剧本把持着有运转版本号的公布历程的1到4的步骤:
$release_branch2_7_1
剧本乐成地运转了,告知你版天职支创立了一切的代码编译并经由过程了测试。假如有成绩,你要在这个版天职歧路径中举行修正,测试这些改动,提交改动给版天职支。你也能够运转别的的剧本兼并这些改动到骨干。
一旦你有了一个版天职支,你修复了一切的成绩,你筹办实践上天生一个公布版本。为了这些,你运转了另外一个剧本往把持4到8的步骤,给了一个版本号。
$release_generate2_7_1
运转这个剧本的了局是一个自力的分发文件―客户能够安装和公布的不异的文件。你已快完事了;在你分开之前只剩一步了。
脏部署细节
部署使用到演示服务器是另外一个多步骤地手动历程,即便你渐渐做,也基础上会堕落。可是由于你的团队必要频仍地部署软件―那准确牢靠地部署在任什么时候候都很主要―你已主动化了部署步骤。当你运转部署剧本的时分一切的脏部署细节为你实行。
$deploy
在这类情形下,剧本传输分发文件到演示服务器解包一切的部署模块到他们各自的路径。但在剧本实践在使用服务器实行前,另有一步必要完美。
你不想主动地部署使用,只是由于一个愚昧的设置成绩而不克不及入手下手。在使用洁净地运转之前,你的使用有一个设置值的数字必要得当地设置。因而在启动使用服务器之前,剧本运转了一套诊断测试来疾速查明部署中任何潜伏的成绩。
出格的,你已注重到弄坏了数据库设置的是一个一般的部署毛病。调试这个成绩让你失落了很多头发,以是上个礼拜你用JUnit写了上面的诊断测试:
清单4:
publicclassDiagnosticTestsextendsjunit.framework.TestCase{
publicvoidtestDatabaseConnection(){
Databasedatabase=newDatabase();
try{
database.connect();
}catch(RuntimeExceptione){
fail("Unabletoconnecttothedatabase"+
database.getURL()+"."+
"Pleasecheckthedatabase.urlproperty.");
}
}
}
testDatabaseConnection办法实验利用一个项目标数据库类实例往毗连数据库。谁人类从设置文件里读进了设置的值,就像database.url如许的属性。假如诊断测试不克不及毗连到数据库,那看起来在运转的时分你得使用将要蒙受一样的运气了。因而,假如connect办法在诊断测试挪用时抛出一个非常,fail()办法被挪用来打印一个有效的信息来匡助你修复成绩。
万分感激,部署剧本呈报没有毛病。这告知你使用已被部署了,一切的诊断测试经由过程了,使用服务器也被启动了。你得演示在运转了!
保密监督器
你点击了web使用的几个页面做一个快速健全的检测。这看起来很棒,但你想今晚晓得关于驱动今天的演示来讲它仍然会很棒,如许你就能够睡好了。项目是在线的,如许你全部早晨都能够晓得有甚么欠好的事变产生在演示上。
不要忧虑。你从你的主动化工具箱找个程序能够每隔几分钟搜刮一个web网站中的像"Error"大概"Exception."如许的有关毛病的词。假如有这类词呈现,大概web网站变得不成用了,监督器将发一个SMS动静到你到手机上。如许的话,假如使用当失落了,你会有对照多的工夫在演示前修复它。在你跑出办公室门之前,你把监督器挂到演示站点上:
$monitorhttp://demoserver:8080/whizbang
在tee-ball的园地,你看到你得儿子走上了本垒板。其间,在你得办公室,你牢靠的监督程序单独运转着。你的手机就在中间,但他一直没响,你像个孩子似的睡了由于演示将没有妨碍的停止。
向前和向上
演示是云云乐成以致于客户为了失掉使用的拷贝一向排到了门口。提交分发文件到你公司的网站大概烧多少的光盘将拖慢你得团队,假如没有主动化剧本来把持那些义务的话,也会是一样的。假如有人刚巧呈报了一个毛病,你能够轻松的从版本把持中从头天生演示。当毛病被修改,你能够按一下按钮天生一个新的公布。
不管你在哪儿,主动化都能够依托成绩产生时更早地关照你来匡助削减演示失利的风险。主动化也节俭了你的工夫,包管了局分歧,经由过程给你供应可反复的办法来构建和部署你的软件。当你持续筹办演示和公布新软件时,主动化能够屡次地发扬感化。
实践的项目主动化
不幸的,这个故事对很多项目来讲其实不实在,大概也包含你的项目。很多团队勉力用手工往做这些项目标琐事,但人们做这类反复性的事情其实不如盘算机做的那末好。这些团队冒险利用分歧的办法运转一个历程,一次只存眷一点,只在一台呆板上而不在其他呆板上,大概做着毛病的事变。坦率的说,你晓得你有比延续构建更好的事变往做,按着多步清单,拷贝文件到服务器,监督运转的程序。但你如何才干敏捷无效地把这一块块的事情跟尾到一同呢?
从这篇文章看起来,主动化你如今大概下一个项目包含了大批事情。谢天谢地,你不用明天就主动化你一切的项目历程来入手下手明白主动化的优点。你主动化的每一个项目标琐事都是一笔投资,能当即报答和随工夫增添代价。你能够借助收费的可用工具如Ant,Maven,CruiseControl,JUnit,和复杂的剧本一步步地敏捷地入手下手。PragmaticProjectAutomation这本书告知你如何用你的盘算机一次次的用一样的体例来做你项目标反复性的义务,不再干扰你。这意味着你将具有更多的工夫和精神往做真正使人冲动―有应战性--的事变就像写高质量的代码。
还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。 |
|