关于ant的好处,不多说,大家去http://ant.去看看就知道了。目前ant支持很多种语言,而且几乎所有的Java开发工具都提供了ant的支持。比如我用的最多的JBuilder和Eclipse都对ant提供了很好的支持。ant使用一个xml文件来描述需要做的事情,然后通过ant的工具包运行这个xml文件来实现我们需要实现的功能。一般情况下,这个xml文件取名叫build.xml。也可以是其它名字,但是必须要在编译的时候指定文件名。
ant功能非常强大,也是XP(极限编程)所推崇的一个工具。就我们用的最多的功能,就是编译.java文件,打包成.jar文件,编译EJB,生成war,生成ear,生成报告等等。前面几种功能用的非常多,但是生成报告和相应的xml/HTML文件报告的功能也是非常有好处的。但是本文不准备做这方面的介绍。(还记得吴忠宪的经典语录吧:“接下来大家一定以为我采访下一个小马,错~我要采访我们的吉他手,这才是我们节目的精髓,让你永远想不到我们要做什么(走到吉他手旁边)现在我站在吉他手旁边,(转向鼓手)那么请鼓手谈谈想法~~但是他的看法我们不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 命令当作参数来使用。最后一个就是target,一个target就是我们的一个目标,整个build.xml是由很多的target组织起来的,比如我们的init的target,我们的compile的target,比如我们的编译ejb的target,比如我们打包的ear的target等等。这些target之间可以存在一个依赖关系,也就是,一个target的执行,必须在另外一个target的执行之后,才能执行。比如
<target depends="cleanxml,cleanclass" name="clean"/>
其意义是说,当前的target名字是clean,它的执行必须先执行名字叫cleanxml和cleanclass的target。关于其它更详细的信息,比如可以在一个xml中引用另一个xml文件等等,因为和我们介绍的内容关系不大,就不一一详细列举了。
可能我们在使用ant的时候,需要用到一些系统变量,比如我们设置的JAVA_HOME、PROJECT_HOME等等。如何在ant中得到这些内容呢?其实说穿了,so so eary。在你的build.xml文件中建立一个property就可以了。
<property environment="env"/>
<property name="jdk.home" value="${env.JAVA_HOME}"/>
OK,现在jdk.home的属性里边就保存了我们在系统中设置的JAVA_HOME的值了。是不是非常简单。
因为我们是要在weblogic下发布和运行我们的应用,所以这里需要得到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命令和相应的属性意义,我们就不一一介绍了。当我们执行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文件
很多的时候,我们的应用都要打包进行发布,这样不至于源文件过于分散。打包的理由就不详细说明了。
<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包一起来使用运行。但是我发现,如果你使用了EJB,可能会有些麻烦。
举例来说,我的ejb文件中的打印信息,我都采用了log4j来处理。如果这里打包不包含这些jar包,那么编译后的ejb在执行的时候,会不停的抛出java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory,就算你吧相应的jar包都和所有的ejb包组合在一起打包成一个ear来执行都不行。非常奇怪,只能在初次打包的时候就加入进去,然后编译ejb,再执行。
三.使用ant编译基于Weblogic的ejb
在编译ejb之前,首先需要把相应的源文件先打包成一个临时的jar文件(执行二),要保证相应的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文件。这一步就编译出来我们真正可以执行的ejb了。看来也很简单啊!
四.打包war应用
通过ant来打包war应用,可以使用ant提供的标准war命令来实现。
<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上发布和更新ejb
需要先说明一下,发布ejb和更新ejb的命令,ant的标准文档上提供了一个命令叫serverdeploy,他提供了一个专门针对weblogic的发布方法。同时,WebLogic也提供了一个服务weblogic.Deployer也可以用来发布更新和取消发布,很遗憾,我试用了一下,不好使,可能我使用的参数有问题,大家可以自行研究一下。
另外,如果应用是第一次发布,也就是说你的WebLogic上面还没有这个应用名字,可能需要使用deploy,而重新发布,必须使用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等参数。我曾经试过,把用户名和密码写在一个properties中,但是在发布和update的时候,总是提示认证不通过的问题,有谁知道,可以告诉我。
七.在WebLogic上发布和更新war
发布war和发布ejb基本上没有太大变化,只是修改一下source参数即可。
等我写完了,我才发现,这篇文章跟WebLogic没有太大关系,嘿嘿