1 maven和ant的比較
第一:每次和別人說maven的時候,很多會認(rèn)為是全新的東西而不肯放棄ant。其實,ant腳本是可以直接運行在maven中的。
假如要說maven和ant有什么差別,我覺得最大的差別就是在于maven的編譯以及所有的腳本都有一個基礎(chǔ),就是POM(PRoject object model)。這個模型定義了項目的方方面面,然后各式各樣的腳本在這個模型上工作,而ant完全是自己定義,顯然maven更勝一籌。
第二:Maven對所依靠的包有明確的定義,如使用那個包,版本是多少,一目了然。而ant則通常是簡單的inclde 所有的jar。導(dǎo)致的最終結(jié)果就是,你根本無法確定JBoss中的lib下的common-logging 是哪個版本的,唯一的方法就是打開 META-INF 目錄下MANIFEST.MF。估計JBoss遲早會轉(zhuǎn)向Maven的。
第三:Maven是基于中心倉庫的編譯,即把編譯所需要的資源放在一個中心倉庫里,如jar,tld,pom,等。當(dāng)編譯的時候,maven會自動在倉庫中找到相應(yīng)的包,假如本地倉庫沒有,則從設(shè)定好的遠(yuǎn)程倉庫中下載到本地。這一切都是自動的,而ant需要自己定義了。這個好處導(dǎo)致的結(jié)果就是,用maven編譯的項目在發(fā)布的時候只需要發(fā)布源碼,小得很,而反之,ant的發(fā)布則要把所有的包一起發(fā)布,顯然maven又勝了一籌。
第四:maven有大量的重用腳本可以利用,如生成網(wǎng)站,生成javadoc,sourcecode reference,等。而ant都需要自己去寫。試試 maven site 的效果。
第五:maven目前不足的地方就是沒有象ant那樣成熟的GUI界面,不過mavengui正在努力中。目前使用maven最好的方法還是命令行,又快又方便。
最后,總結(jié)一下,轉(zhuǎn)向maven會為你節(jié)省更多的時間。
2. build.properties 和project.properties
build.properties 用來方編譯信息比較好,project.properties用來放項目信息比較好。
Build.properties的實例,把他放在用戶目錄下(C:/Documents and Settings/user),就可以使用所有項目都共享這個信息。
maven.repo.local=f:/java/repository
maven.repo.remote=http://mirrors.sunsite.dk/maven/
#maven.proxy.host=127.0.0.1
#maven.proxy.port=80
maven.compile.target = 1.4
maven.compile.source = 1.4
3 如何進行多個項目的開發(fā)。
在用Maven進行一個項目下有多個子項目開發(fā)的時候,常用的就是MulitProject 腳本 <maven:reactor >。
舉例來看,下圖就是一個項目中的子項目,該子項目又有兩個子項目,只要在project中定義了繼續(xù)關(guān)系,1.0能夠?qū)aven.xml中的腳本及project.properties 和build.properties中的屬性 傳播到子項目中去,這個特性似乎在RC版本中沒有完全實現(xiàn)。
知道了Maven 的這些特性,就可以將大量的公共腳本寫在maven。xml中,子項目就可以很方便的調(diào)用了。
<!--==================================================================-->
<!-- Hibernate Doclet-->
<!--==================================================================-->
<goal descr <taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="maven.dependency.classpath"/> <echo>+---------------------------------------------------+</echo> <echo> Hibernate Doclet...... </echo> <echo>+---------------------------------------------------+</echo> <mkdir dir="${project.xdoclet.hibernate.destDir}"/> <hibernatedoclet destdir="${project.xdoclet.hibernate.destDir}" mergedir="${project.xdoclet.hibernate.mergeDir}" excludedtags="${project.xdoclet.hibernate.excludedtags}" addedtags="${project.xdoclet.hibernate.addedtags}" force="${project.xdoclet.hibernate.force}" verbose="${project.xdoclet.hibernate.verbose}"> <fileset dir="${project.xdoclet.hibernate.srcDir}"> <include name="**/*.java"/> </fileset> <hibernate version="2.0"/> <!-- <jbossservice transactionStrategy="${project.xdoclet.hibernate.jbossservice.transactionStrategy}" userTransactionName ="${project.xdoclet.hibernate.jbossservice.userTransactionName}" serviceName="${project.xdoclet.hibernate.jbossservice.serviceName}" jndiName="${project.xdoclet.hibernate.jbossservice.jndiName}" dataSource="${project.xdoclet.hibernate.jbossservice.dataSource}" dialect="${project.xdoclet.hibernate.jbossservice.dialect}" showSql="${project.xdoclet.hibernate.jbossservice.showSql}" templateFile="${project.xdoclet.hibernate.jbossservice.templateFile}" /> --> <hibernatecfg transactionManagerLookup="${project.xdoclet.hibernate.cfg.transactionManagerLookup}" transactionStrategy="${project.xdoclet.hibernate.cfg.transactionStrategy}" userTransactionName ="${project.xdoclet.hibernate.cfg.userTransactionName}" jndiName="${project.xdoclet.hibernate.cfg.jndiName}" dataSource="${project.xdoclet.hibernate.cfg.dataSource}" dialect="${project.xdoclet.hibernate.cfg.dialect}" showSql="${project.xdoclet.hibernate.cfg.showSql}" /> </hibernatedoclet> </goal> 在任何一個子項目中,就可以直接調(diào)用project:hibernate-xdoclet腳本了。就可以 <maven:reactor 的不足在于,假如你這樣定義 <maven:reactor basedir="${basedir}" postProcessing="true" includes="portal/project.xml,common/project.xml" goals="project:deploy" banner="Deploying Service:" ignoreFailures="false" /> 本來原意是想讓Portal早于common進行編譯,不過reactor實際將先編譯common,再編譯portal。因為他是以名稱來決定編譯次序,顯然是不好的,因為多個子項目之間往往是有先后關(guān)系。解決的方法就是,定義多個reactor 了。 4 定義自己的maven.xml 模板。 maven的腳本是基于AOP的,也就是你可以在任何一個goal之前和之后插入自己的代碼,所以maven的腳本沒有固定的寫法。 這里有我寫過的一個maven模板。 <?xml version="1.0" encoding="gb2312"?> <project default="project:deploy" xmlns:maven="jelly:maven" xmlns:j="jelly:core" xmlns:util="jelly:util"> <!-- 一般項目分為四個里程碑:初始化、精化、構(gòu)建、部署 --> <preGoal name="project:deploy"> <attainGoal name="project:inception"/> <attainGoal name="project:elaboration"/> <attainGoal name="project:constrUCtion"/> <attainGoal name="project:transition"/> </preGoal> <goal name="project:deploy"> </goal> <!--完成一些初始化工作 --> <goal name="project:inception"> <attainGoal name="clean"/> </goal> <!-- 主要是xdoclet 產(chǎn)生各種文件--> <goal name="project:elaboration"> <attainGoal name="project:ejb-xdoclet"/> </goal> <!-- 編譯項目--> <goal name="project:construction"> <!-- 調(diào)用war 插件 --> <attainGoal name="war:war"/> </goal> <!-- 對編譯好的項目進行組合預(yù)備部署 --> <goal name="project:transition"> </goal> </project> 5 很多公共腳本都不正常 這是很正常的事情,事實上很多腳本 xdoclet,middlegen等都存在一定的問題,假如出現(xiàn)這種情況,最直接的辦法就是把它們的腳本自己封裝一遍,做成適合自己的腳本。 比如,xdoclet 1.2之前的腳本就不太好用,我就到maven的cache目錄(C:/Documents and Settings/user/.maven/cache),找到想修改的插件目錄,里面都會有plugin.jelly,它是一個xml文件,里面就是腳本了,然后copy到自己的maven.xml中,就可以直接調(diào)用了。 以下,是我寫的自己常用的web xdoclet腳本 <!--==================================================================--> <!-- WEB Doclet--> <!--==================================================================--> <goal description="xdoclet for web " name="project:web-xdoclet" > <taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask" classpathref="maven.dependency.classpath"/> <echo>+---------------------------------------------------+</echo> <echo> Running WebDoclet...... </echo> <echo>+---------------------------------------------------+</echo> <mkdir dir="${project.xdoclet.web.destDir}"/> <webdoclet destdir="${project.xdoclet.web.destDir}" mergedir="${project.xdoclet.web.mergeDir}" excludedtags="${project.xdoclet.web.excludedtags}" addedtags="${project.xdoclet.web.addedtags}" force="${project.xdoclet.web.force}" verbose="${project.xdoclet.web.verbose}"> <fileset dir="${project.xdoclet.web.srcDir}"> <include name="**/*.java"/> </fileset> <deploymentdescriptor servletspec="${project.xdoclet.web.version}" destdir="${project.xdoclet.web.webxml.dir}" xmlencoding="${project.xdoclet.web.xmlencoding}" templateFile="${project.xdoclet.web.templateFile}" /> <strutsconfigxml destdir="${project.xdoclet.web.strutsconfigxml.dir}" xmlencoding="${project.xdoclet.web.strutsconfigxml.xmlencoding}" version="${project.xdoclet.web.strutsconfigxml.version}" templateFile="${project.xdoclet.web.strutsconfigxml.templateFile}" /> <jsptaglib jspversion="${project.xdoclet.web.jsptaglib.version}" destdir="${project.xdoclet.web.jsptaglib.dir}" shortname="${project.xdoclet.web.jsptaglib.shortname}" validateXml="${project.xdoclet.web.jsptaglib.validatexml}" xmlencoding="${project.xdoclet.web.jsptaglib.xmlencoding}" filename="${project.xdoclet.web.jsptaglib.filename}" templateFile="${project.xdoclet.web.jsptaglib.templateFile}" /> <!-- <jbosswebxml destdir="${project.xdoclet.web.jbosswebxml.dir}" mergeDir="${project.xdoclet.web.jbosswebxml.dir}"/> --> </webdoclet> </goal> 這個腳本可以生成web.xml struts-config.xml tld jboss-web.xml ,自己可以根據(jù)需要很方便的修改了。其實不難看出,這些都是ant腳本。所以,假如沒有合適的插件,最好的方法就是自己動手寫一個。 6 無法運行maven,報錯為 缺少根組件。 這個錯誤是因為你采用的編輯器(比如:ultraedit)在<?xml 前添加了多余的字符,導(dǎo)致xml解析器無法處理xml文件,這個錯誤經(jīng)常碰到。解決的方法就是把內(nèi)容copy下來,重新paste到新的文件,覆蓋老文件。或者用別的編輯器把多余字符去掉。 待續(xù)。。。
新聞熱點
疑難解答