Ant编译多个依赖工程jar、war包

ant编译war包

背景介绍:

项目由3个工程组成,3个工程分别为businessManager(以下简称为busi)工程、FrameWork(以下简称为frame)工程、ppfmgr(以下简称为mgr)工程,3个工程代表的含义分别为,busi代表业务工程,即项目中所有的业务层逻辑处理都放到该工程中,frame代表工具类及项目中所有用到的第三方jar包。mgr为web工程,即所有的前端和controller层放到该工程中,由于我是中间介入到该项目中,所以对于该项目中jar包没有用maven管理表示很不爽。不过因祸得福,正因为没有maven进行管理,所以才有了这篇ant编译war包的文章。开发团队比较小,所以每次测试部署都是开发人员的活,为了把工作尽量做到自动化,想到了用jenkins工具,网上了解了一下该工具,发现和当前的需求非常吻合,即解决项目部署的自动化操作。在后来的了解中发现,其实jenkins能实现的功能不仅仅是自动化部署。

项目结构介绍:

  • BusinessManager工程结构
    BusinessManager工程
    该工程主要包括了业务层的代码,即所有的service层和dao层的代码以及mapping文件都在该工程中,最后要把该工程编译为jar包放到war包中,所以该层在编译为jar包时需要处理的包括两部分,一部分为将java文件编译为class文件,另一部分是将工程中的配置文件和编译的class文件一起打成jar包。值得注意的是打jar包时,一定要将配置文件放进去,刚开始由于没注意这个问题,在编译好war包后启动服务器时一直报错,后来排查了好久才发现是因为jar包中缺少了应该有的配置文件。
  • FrameWork工程结构
    FrameWork工程
    从上图可以看到该工程主要包含了一些工具类和第三方jar包,同样需要将该工程编译为jar包放到war包中,编译该工程时比较顺利,没遇到什么坑。
  • ppfmgr工程结构
    ppfmgr工程
    该工程为web项目的前端,主要包括了前端展示页面和controller层以及项目的配置文件。该工程需要编译为war包,同样在将该工程编译为war包时第一步先编译java文件为class文件,之后在打成war包时需要将配置文件放到war包中。

build.xml文件介绍

该部分的介绍将分别通过3个工程进行介绍,其中Businessmanager工程最终需要编译为jar文件,FrameWork工程最终需要编译为jar文件,之后会将这两个jar包放到FrameWork工程下的lib目录中,方便后面打war包时引入,ppfmgr工程最终需要编译为war包。
- build.xml公共部分介绍:
这里写图片描述
标签property即定义了一些变量,主要都是需要文件的路径,由于第一次写build.xml文件,所以可能有一些细节没有注意,写的不是特别规范。变量很容易理解就不做介绍了。下面的path为编译项目时使用的公共部分,主要包含了第三方的jar包,其中lib.dir表示的是FrameWork下的lib中的jar包。而jre.dir为jdk下的jar包位置,刚开始没加时编译会报错,后来查看发现项目中用到了一个jre下的一个jar包。ant.dir为ant编译时需要的jar包。catalina.home为tomcat目录,这个不是自己添加的,原本的build.xml文件中就存在,没有删掉,不影响,估计应该是因为有的项目中会用到tomcat下的jar包吧,比如servlet,一般如果项目中没有单独的导入,就是用的tomcat下的。
这里写图片描述
截图中的内容分别是删除文件夹及文件和创建文件夹的,为了保证每次编译的内容都是最新的,还有防止因为修改了build.xml文件的内容导致编译时漏掉了部分文件,而原目录中存在的现象发生。所以在每次编译时都会先进行删除的操作,之后在创建新的目录。
- FrameWork工程编译jar包介绍:
这里写图片描述
该部分的内容主要是将FrameWork工程打成jar包放到FrameWork工程的lib目录下,其中name=”compileFrameWork”表示的是编译java文件为class文件,name=”compileFrameJar”是将刚编译好的class文件打成jar包。
- BusinessManager工程编译jar包介绍:
这里写图片描述
该工程打成jar包需要两步,分别为将java文件编译成class文件,将编译好的class文件和工程中原来存在的配置文件同时打到jar包中。其中name=”compileBusiManager”是用来编译java文件的,而name=”compileBusiJar”则是用来打jar包的,在打jar包的时候会将项目中的配置文件导入进来。
- ppfmgr工程编译及打war包介绍:
这里写图片描述
同样该工程也分两部分进行,第一步是先将java文件编译为class文件,之后在将编译好的文件打成war包,在打war包的时候也需要将项目下的配置文件导入进去。
- 整体的build.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<project name="mgr" default="mgr" basedir="F:/jenkins">  
    <property environment="env" />  
    <property name="webapp.name" value="mgr" />  
    <property name="catalina.home" value="F:/apache-tomcat-8089" />  
    <property name="dist.dir" value="${basedir}/dist" />  
    <property name="ant.dir" value="E:/apache-ant-1.10.1" />  
    <property name="webRoot.dir" value="F:/workspace/ppfmgr/src/main/webapp"/>  
    <property name="src.dir" value="F:/workspace/ppfmgr/src" />   
    <property name="busiManager" value="F:/workspace/ppfundplus/BusinessManager/src"/>
    <property name="frameWork" value="F:/workspace/ppfundplus/Framework/src"/>
    <property name="lib.dir" value="F:/workspace/ppfundplus/Framework/lib" />  
    <property name="build.dir" value="${basedir}/build" />  
    <property name="build.dir.frame" value="${basedir}/build/frame" /> 
    <property name="build.dir.busi" value="${basedir}/build/busi" />
    <property name="jre.dir" value="D:/Program Files/Java/jre7" /> 

    <!-- 初始化classpath -->  
    <path id="project.classpath">  
        <fileset dir="${lib.dir}">  
            <include name="**/*.jar" />  
        </fileset>  
        <!-- 添加jre类路径 -->  
        <fileset dir="${jre.dir}/lib">  
            <include name="*.jar" />  
        </fileset>  
        <!-- 添加tomcat类路径 -->  
        <fileset dir="${catalina.home}/lib">  
            <include name="*.jar" />  
        </fileset>  
        <!-- ant lib包  -->  
        <fileset dir="${ant.dir}">  
            <include name="**/*.jar" />  
        </fileset>  
    </path>  

    <pathconvert pathsep="${line.separator}|   |-- "  
             property="echo.path.compile"  
             refid="project.classpath">  
    </pathconvert>  

    <target name="print_classpath">  
        <echo message="|-- compile classpath"/>  
        <echo message="|   |"/>  
        <echo message="|   |-- ${echo.path.compile}"/>  
    </target>  

    <!-- 删除之前的目录结构 -->  
    <target name="clear" description="清理旧文件">  
        <delete dir="${build.dir}" />  
        <delete dir="${build.dir.frame}" />
        <delete dir="${build.dir.busi}" />
        <delete dir="${dist.dir}" />  
        <delete file="${catalina.home}/webapps/${webapp.name}.war" />  
        <delete dir="${catalina.home}/webapps/${webapp.name}" />  
    </target>  

    <!-- 创建目录结构 -->  
    <target name="init" depends="clear" description="创建初始化目录结构">  
        <mkdir dir="${build.dir}/classes" /> 
        <mkdir dir="${build.dir.frame}/classes" />
        <mkdir dir="${build.dir.busi}/classes" />      
        <mkdir dir="${dist.dir}" />  
    </target>  



    <!-- 编译java -->  
    <target name="compileBusiManager" depends="compileFrameJar" description="编译java文件">  
        <echo message="begin compileBusiManager..." />  
        <javac srcdir="${busiManager}" destdir="${build.dir.busi}/classes"   
            includeantruntime="false" nowarn="on"   
            source="1.7" target="1.7" deprecation="true" debug="true"   
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />  
        </javac>  
        <echo message="end compileBusiManager..." />  
    </target>

    <!-- 将class文件打成 jar包 -->  
    <!-- busiManager打jar包   --> 
    <target name="compileBusiJar" depends="compileBusiManager">   
        <jar jarfile="${lib.dir}/BusinessManager.jar"> 
            <fileset dir="${build.dir.busi}/classes">   
                <include name="**/*.class"/>   
            </fileset> 
            <fileset dir="${busiManager}/main/resource">   
                <include name="**/*.xml" />  
                <include name="**/*.properties" />  
                <include name="**/*.sql" />   
            </fileset>   
        </jar>   
    </target>

    <!-- 将class文件打成 jar包 -->  
    <!-- frameWork打jar包   --> 
    <target name="compileFrameJar" depends="compileFrameWork">   
        <jar jarfile="${lib.dir}/Framework.jar">   
            <fileset dir="${build.dir.frame}/classes">   
                <include name="**/*.class"/>   
            </fileset>   
        </jar>   
    </target>  

    <!-- 编译java -->  
    <target name="compileFrameWork" depends="init" description="编译java文件">  
        <echo message="begin compileFrameWork..." />  
        <javac srcdir="${frameWork}" destdir="${build.dir.frame}/classes"   
            includeantruntime="false" nowarn="on"   
            source="1.7" target="1.7" deprecation="true" debug="true"   
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />   
        </javac>  
        <echo message="end compileFrameWork..." />  
    </target>
     <!-- 编译java -->  
    <target name="compileMgr" depends="compileBusiJar" description="编译java文件">  
        <echo message="begin compile..." />  
        <javac srcdir="${src.dir}" destdir="${build.dir}/classes"   
            includeantruntime="false" nowarn="on"   
            source="1.7" target="1.7" deprecation="true" debug="true"   
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />  
        </javac>  
        <copy todir="${build.dir}">  
            <fileset dir="${src.dir}">  
                <include name="**/*.xml" />  
                <include name="**/*.properties" />  
                <include name="**/*.sql" />  
            </fileset>   
        </copy>  
        <echo message="end compile..." />  
    </target>

    <!-- 打成war包, 名称默认为 项目名 -->  
    <target name="mgr" depends="compileMgr" description="将工程打成war包">  
        <echo message="begin war..." />  
        <war destfile="${dist.dir}/${webapp.name}.war" basedir="${webRoot.dir}"   
            webxml="${webRoot.dir}/WEB-INF/web.xml">  
            <lib dir="${lib.dir}" />  
            <classes dir="${build.dir}/classes" />  
            <fileset dir="${webRoot.dir}">  
                <include name="***.*" />  
            </fileset>  
        </war>  
        <echo message="end war..." />  
    </target>  

    <!-- copy war包 tomcat的deploy目录  
    <target name="deploy" depends="war" description="部署项目">  
        <echo message="begin deploy..." />  
        <copy file="${dist.dir}/${webapp.name}.war" todir="${catalina.home}/webapps" />  
        <echo message="end deploy..." />  
    </target>   -->

</project>  

总结:

知识的学习在于实践,只有在用到的时候进行学习才会体现出价值,而且在学到的同时才会更有成就感。本来刚开始是准备搞一个jenkins自动化部署,而在使用jenkins时发现,编译工程可以使用几种方式,其中最简单的方式就是使用maven进行,只需要进行简单的配置,就可以实现。而比较麻烦一点的,就是使用ant进行编译,ant编译麻烦的地方主要体现在编写build.xml文件,由于平时使用开发工具,每次编译war包时都使用开发工具就可以实现,不用额外的编译工具。所以在刚开始接触ant编译时看到build.xml文件,确实不知从何下手,慢慢的研究、学习后发现其实里面的东西不是特别复杂,只是有些东西存在不知道怎么用而已。学习的道路很漫长,只要不放弃,终会见到光明。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值