關于ant的好處,不多說,大家去http://ant.去看看就知道了。目前ant支持很多種語言,而且?guī)缀跛械腏ava開發(fā)工具都提供了ant的支持。比如我用的最多的JBuilder和Eclipse都對ant提供了很好的支持。ant使用一個xml文件來描述需要做的事情,然后通過ant的工具包運行這個xml文件來實現(xiàn)我們需要實現(xiàn)的功能。一般情況下,這個xml文件取名叫build.xml。也可以是其它名字,但是必須要在編譯的時候指定文件名。
ant功能非常強大,也是XP(極限編程)所推崇的一個工具。就我們用的最多的功能,就是編譯.java文件,打包成.jar文件,編譯EJB,生成war,生成ear,生成報告等等。前面幾種功能用的非常多,但是生成報告和相應的xml/HTML文件報告的功能也是非常有好處的。但是本文不準備做這方面的介紹。(還記得吳忠憲的經典語錄吧:“接下來大家一定以為我采訪下一個小馬,錯~我要采訪我們的吉他手,這才是我們節(jié)目的精髓,讓你永遠想不到我們要做什么(走到吉他手旁邊)現(xiàn)在我站在吉他手旁邊,(轉向鼓手)那么請鼓手談談想法~~但是他的看法我們不care~~(然后走開)”)我們主要介紹前面說道的幾種常用的命令。嘿嘿~
首先,需要說明一下build.xml文件的一些信息,build.xml文件是通過一系列的property、target、path等組織起來的。property可以用來保存一些常量信息,比如JAVA_HOME路徑、BEA_HOME路徑、src的路徑、build的臨時目錄的路徑等等。然后在其它地方使用${propertyName}的方式進行引用。這樣就可以避免要修改一個路徑需要通篇修改build.xml文件的問題。path是一些路徑信息,比如我們可以指定編譯我們的應用需要的一些jar包的位置信息,舉例說明一下
<path id="project.class.path">
<pathelement location="${dest}"/>
<fileset dir="${WebLogic}" includes="**/*.jar"/>
<fileset dir="${strus1.1-final.home}" includes="**/*.jar"/>
<fileset dir="${jdk.home}/jre/lib" includes="**/*.jar"/>
<fileset dir="${jdk.home}/lib" includes="**/*.jar"/>
</path>
這里,我把所有需要用來編譯應用的包都放到一起,取名叫project.class.path,然后在編譯的時候,提供給ant 命令當作參數(shù)來使用。最后一個就是target,一個target就是我們的一個目標,整個build.xml是由很多的target組織起來的,比如我們的init的target,我們的compile的target,比如我們的編譯ejb的target,比如我們打包的ear的target等等。這些target之間可以存在一個依賴關系,也就是,一個target的執(zhí)行,必須在另外一個target的執(zhí)行之后,才能執(zhí)行。比如
<target depends="cleanxml,cleanclass" name="clean"/>
其意義是說,當前的target名字是clean,它的執(zhí)行必須先執(zhí)行名字叫cleanxml和cleanclass的target。關于其它更詳細的信息,比如可以在一個xml中引用另一個xml文件等等,因為和我們介紹的內容關系不大,就不一一詳細列舉了。
可能我們在使用ant的時候,需要用到一些系統(tǒng)變量,比如我們設置的JAVA_HOME、PROJECT_HOME等等。如何在ant中得到這些內容呢?其實說穿了,so so eary。在你的build.xml文件中建立一個property就可以了。
<property environment="env"/>
<property name="jdk.home" value="${env.JAVA_HOME}"/>
OK,現(xiàn)在jdk.home的屬性里邊就保存了我們在系統(tǒng)中設置的JAVA_HOME的值了。是不是非常簡單。
因為我們是要在weblogic下發(fā)布和運行我們的應用,所以這里需要得到weblogic的一些jar包的路徑信息。
<property name="WebLogic" value="${env.WEBLOGIC_HOME}/weblogic81/server/lib"/>
一.使用ant來編譯.java文件,這是最常用的功能。
<target name="compile">
<javac excludes="$(xml.home)" bootclasspathref="project.class.path" classpathref="j2ee.path" debug="true" deprecation="true" destdir="${dest}" nowarn="false" source="1.4">
<src path="${src}"/>
</javac>
</target>
關于其中的javac命令和相應的屬性意義,我們就不一一介紹了。當我們執(zhí)行ant compile的時候,就會把src目錄下的所有java文件編譯成class文件,放到${dest}目錄下。這里需要說明一點,如果你的應用中含有assert這種語句。那么一定要設定javac的屬性source為1.4,否則會報錯。錯誤信息如下:
warning: as of release 1.4, assert is a keyword, and may not be used as an identifier
其實在JBuilder9和Eclipse中,默認的編譯選項都會存在這個問題。Eclipse中,我們只需要在Windows-preferences-java-compiler-compliance and classfiles下面,去掉Use defalut compliance settings前面的選擇,然后在下面相應的選項中選擇1.4就可以了。同理,在JBuider9中選中項目,然后右鍵選擇屬性,在其中有一個enable assert keyword,選中就可以了(JBuilderx還沒有用過)
二.使用ant打包成jar文件
很多的時候,我們的應用都要打包進行發(fā)布,這樣不至于源文件過于分散。打包的理由就不詳細說明了。
<jar jarfile="temp.jar" basedir="${dest}">
<zipfileset src="${lib.home}/commons-logging.jar"/>
<zipfileset src="${lib.home}/junit.jar"/>
<zipfileset src="${lib.home}/log4j-1.2.8.jar"/>
<fileset dir="${src}" includes="**/*.properties"/>
</jar>
這里需要說明一下,這里使用的zipfileset,主要是在程序打包的時候,把相應的包也一起打包成一個整體。一般情況下,這是不需要的,因為你所打包的東西是可以和別的jar包一起來使用運行。但是我發(fā)現(xiàn),如果你使用了EJB,可能會有些麻煩。
舉例來說,我的ejb文件中的打印信息,我都采用了log4j來處理。如果這里打包不包含這些jar包,那么編譯后的ejb在執(zhí)行的時候,會不停的拋出java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory,就算你吧相應的jar包都和所有的ejb包組合在一起打包成一個ear來執(zhí)行都不行。非常奇怪,只能在初次打包的時候就加入進去,然后編譯ejb,再執(zhí)行。
三.使用ant編譯基于Weblogic的ejb
在編譯ejb之前,首先需要把相應的源文件先打包成一個臨時的jar文件(執(zhí)行二),要保證相應的xml文件都正確無誤。xml文件主要包括ejb-jar.xml、weblogic-ejb-jar.xml、weblogic-cmp-rdbms-jar.xml、weblogic-cmp-extras.xml。后兩個xml文件是在有cmp的情況下才使用的。關于這些文件的具體配置,在此不詳述。
<java classname="weblogic.appc" failonerror="true" fork="true" jvm="${jdk.home}/bin/java">
<classpath>
<fileset dir="${WebLogic}" includes="**/*.jar"/>
<fileset dir="${lib.home}" includes="**/*.jar"/>
</classpath>
<arg value="-keepgenerated"/>
<arg value="-forceGeneration"/>
<arg value="-compiler"/>
<arg value="${jdk.home}/bin/javac"/>
<arg value="temp.jar"/>
<arg value="-output"/>
<arg value="ejb.jar"/>
</java>
這其實是簡單的通過java來調用Weblogic提供的一個編譯ejb的程序,來編譯并且打包我們的ejb應用。這里的classpath是我們在編譯過程中,需要用到的jar包的集合。關于這個命令的詳細的說明,大家可以參考bea文檔庫的說明。http://e-docs./wls/docs81/ejb/appc_ejbc.html
這個命令通過簡單的調用weblogic.appc和剛才編譯好的temp.jar文件和一些配置來生成最終的ejb.jar文件。這一步就編譯出來我們真正可以執(zhí)行的ejb了??磥硪埠芎唵伟?
四.打包war應用
通過ant來打包war應用,可以使用ant提供的標準war命令來實現(xiàn)。
<target depends="resource" name="war">
<war compress="false" destfile="myapp.war" webxml="myapp/WEB-INF/web.xml">
<!-- 所有app應用的class文件 -->
<classes dir="${src.home}">
<patternset refid="dest.exclude"/>
<include name="**/*.*"/>
</classes>
<!-- 所有的應用需要的文件.js、jsp、properties、jpeg等等 -->
<fileset dir="csm">
<include name="**/*.class"/>
<include name="**/*.config"/>
<include name="**/*.ear"/>
<include name="**/*.gif"/>
<include name="**/*.htm"/>
<include name="**/*.html"/>
<include name="**/*.jar"/>
<include name="**/*.jnlp"/>
<include name="**/*.jpe"/>
<include name="**/*.jpeg"/>
<include name="**/*.jpg"/>
<include name="**/*.JPG"/>
<include name="**/*.js"/>
<include name="**/*.jsp"/>
<include name="**/*.properties"/>
<include name="**/*.war"/>
<include name="**/*.xml"/>
<include name="**/*.zip"/>
<exclude name="WEB-INF/web.xml"/>
<exclude name="WEB-INF/lib/"/>
<exclude name="WEB-INF/classes/"/>
</fileset>
<!-- WEB-INF下面的文件,注意不要包含web.xml文件 -->
<fileset dir="csm">
<exclude name="WEB-INF/web.xml"/>
<include name="WEB-INF/*.*"/>
</fileset>
<!-- 所有需要用到的lib包 -->
<lib dir="${lib.home}">
<include name="commons-beanutils.jar"/>
<include name="commons-collections.jar"/>
<include name="commons-digester.jar"/>
<include name="commons-fileupload.jar"/>
<include name="commons-lang.jar"/>
<include name="commons-logging.jar"/>
<include name="commons-validator.jar"/>
<include name="log4j-1.2.8.jar"/>
<include name="struts.jar"/>
<include name="tclcsm.jar"/>
</lib>
</war>
</target>
五.打包為ear
我們的應用都可以打包成一個ear文件。注意,需要提供一個application.xml文件。這里只是簡單的舉例說明,把ejb打包成一個ear,沒有太大的實際意義。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java./dtd/application_1_3.dtd">
<application>
<display-name>Myapp</display-name>
<module>
<ejb>ejb.jar</ejb>
</module>
</application>
相應的ant命令如下:
<ear appxml="${ear.home}/META-INF/application.xml" compress="false" destfile="Myapp.ear">
<fileset dir="${ear.home}" includes="ejb.jar"/>
</ear>
</target>
六.在WebLogic上發(fā)布和更新ejb
需要先說明一下,發(fā)布ejb和更新ejb的命令,ant的標準文檔上提供了一個命令叫serverdeploy,他提供了一個專門針對weblogic的發(fā)布方法。同時,WebLogic也提供了一個服務weblogic.Deployer也可以用來發(fā)布更新和取消發(fā)布,很遺憾,我試用了一下,不好使,可能我使用的參數(shù)有問題,大家可以自行研究一下。
另外,如果應用是第一次發(fā)布,也就是說你的WebLogic上面還沒有這個應用名字,可能需要使用deploy,而重新發(fā)布,必須使用update。我試用了一下,用undeploy,然后再用deploy好像會出問題。一直沒有搞懂是怎么回事。
<target name="deploy">
<serverdeploy action="deploy" source="ejb.jar">
<weblogic application="myejb"
server="t3://localhost:7001"
classpath="${WebLogic}/weblogic.jar"
username="weblogic"
password="xxxxxxxx"
component="myejb:myserver"
debug="true"/>
</serverdeploy>
</target>
<target name="update">
<serverdeploy action="update" source="ejb.jar">
<weblogic application="myejb"
server="t3://localhost:7001"
classpath="${WebLogic}/weblogic.jar"
username="weblogic"
password="xxxxxxxx"
component="myejb:myserver"
debug="true"/>
</serverdeploy>
</target>
還需要說明一下,如果你在使用這兩個命令,一定要注意修改用戶名和密碼,同時要修改server和component等參數(shù)。我曾經試過,把用戶名和密碼寫在一個properties中,但是在發(fā)布和update的時候,總是提示認證不通過的問題,有誰知道,可以告訴我。
七.在WebLogic上發(fā)布和更新war
發(fā)布war和發(fā)布ejb基本上沒有太大變化,只是修改一下source參數(shù)即可。
等我寫完了,我才發(fā)現(xiàn),這篇文章跟WebLogic沒有太大關系,嘿嘿