使用Ant打包项目为war

现在很多项目Java基本都是基于maven管理的,maven对于jar包管理和打包的方便这里就不再赘述,但是如果没有使用maven管理如何将一个Java Web项目打成war包呢,这里推荐使用Ant。

Ant简介

摘录一段百度百科:

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。

把他理解一个类似于maven的构建工具即可,当然maven更好用,但是对于一些不使用maven管理的项目推荐使用Ant。

Ant下载

官方地址:http://ant.apache.org/

Ant安装

下载后解压,配置ANT_HOME,并将ANT_HOME添加到环境变量

ANT_HOME 
D:\develop\ant\apache-ant-1.9.4
%ANT_HOME%/bin

Ant的使用需要依赖JDK,配置JAVA_HOME即可,配置完成,执行ant -version,可以正确输出版本号表示安装成功。

C:\Users\Vincent>ant -version
Apache Ant(TM) version 1.9.4 compiled on April 29 2014

基本命令

输入ant -h即可查看,摘录部分:

C:\Users\Vincent>ant -h
ant [options] [target [target2 [target3] ...]]
Options:
  -help, -h              print this message
  -projecthelp, -p       print project help information
  -version               print the version information and exit

使用样例

使用Ant打包,现在项目根目录创建一个build.xml文件,Ant会根据这个文件的内容执行编译打包。

<?xml version="1.0" encoding="UTF-8"?>
<project name="my-study-platform" basedir="." default="build">
    <!--输出目录-->
    <property name="outDir" value="D:\tmp\ant"/>
    <!--依赖第三方jar目录-->
    <property name="jdbc" value="database/jdbc"/>
    <property name="lib" value="build/axis_server/lib"/>
    <property name="lib2" value="build/patching/tools/apache-ant/lib"/>
    <property name="lib3" value="batch/encryptutil/lib"/>
    <property name="build" value="www/WEB-INF/lib"/>
    <property name="lib_compiler" value="build/lib_compile"/>

    <path id="my-study-platform.classpath">
        <fileset dir="${jdbc}">
            <include name="*.jar"></include>
        </fileset>
        <fileset dir="${lib}">
            <include name="*.jar"></include>
        </fileset>
        <fileset dir="${lib2}">
            <include name="*.jar"></include>
        </fileset>
        <fileset dir="${lib3}">
            <include name="*.jar"></include>
        </fileset>
        <fileset dir="${build}">
            <include name="*.jar"></include>
        </fileset>
        <fileset dir="${lib_compiler}">
            <include name="*.jar"></include>
        </fileset>
    </path>

    <!--创建临时目录拷贝静态资源-->
    <target name="init">
        <mkdir dir="${outDir}/WEB-INF/classes"/>
        <!--拷贝WEB-INF下文件到classes目录-->
        <copy includeemptydirs="false" todir="${outDir}/WEB-INF/classes">
            <fileset dir="www/WEB-INF/">
                <exclude name="${outDir}/WEB-INF/classes/*"/>
            </fileset>
        </copy>
        <copy includeemptydirs="false" todir="${outDir}/WEB-INF/classes">
            <fileset dir="src">
                <exclude name="src/**/*.java"/>
            </fileset>
        </copy>
    </target>

    <!--编译Java源码-->
    <target name="compile" depends="init">
        <echo message="${ant.project.name}: ${ant.file}" file="${outDir}/war/build.txt"/>
        <javac executable="C:\Program Files\Java\jdk1.7.0\bin\javac.exe"
               encoding="utf-8"
               debug="true"
               includeantruntime="false"
               destdir="${outDir}/WEB-INF/classes">
            <!--  源码路径 -->
            <src path="src/"/>
            <!--  依赖库路径 -->
            <classpath refid="my-study-platform.classpath"/>
        </javac>
    </target>

    <!--打war包-->
    <target name="build" depends="compile">
        <war warfile="${outDir}/war/ROOT.war" webxml="www/WEB-INF/web.xml">
            <classes dir="${outDir}/WEB-INF/classes"/>
            <fileset dir="www"/>
        </war>
        <!--删除临时目录-->
        <delete dir="${outDir}/WEB-INF"></delete>
    </target>

    <target name="clean">
        <delete dir="${outDir}"/>
        <delete file="${outDir}/*"/>
    </target>
</project>

每一个target都是一个ant命令,以上面文件为例:

ant init 初始化构建前的工作比如创建打包输出目录拷贝静态资源等
ant compile 编译Java源文件,依赖库
ant build 拷贝字节码或者拷贝静态资源等
ant clean 删除临时目录

每个命令的执行可以通过depends来指定上一步的过程,来控制整个打包流程。

正常的Java Web项目打包也没这么复杂,我接触的项目是一个由eclipse整改目录结构到idea中的,项目中的依赖,路径可以说是面目全非,打包过程中整合路径是真的痛苦,但是只要可以正确配置路径,还是能跑起来的!

下面对build.xml中的节点具体解释:

  • project 根节点,代表一个工程

    basedir 表示基准目录(`.`代表当前目录,即build.xml所在目录,也可采用绝对路径)
    default 表示默认运行的target(当ant命令没有指定target时,会运行default属性中的target)
    
    
  • target 目标节点,代表着一个构建目标

    depends 表示依赖的target,上一步执行的target
    
    
  • property 设置一个或多个属性(可以在其它地方通过${属性名}进行引用)

    value 表示属性值
    file 表示要加载的属性文件路径(该文件可包含多个属性,类似jdbc.properties的内容)
    
    
  • mkdir 创建目录

    
    
  • delete 删除目录或文件

    file 表示要删除的文件
    
    
  • echo 向屏幕或文件输出信息

    file    表示信息输出到该文件中(如果指定了该属性,信息将不会在屏幕上显示)
    level   表示信息级别(未指定该属性时的默认级别为"warning")
    
    
  • copy 拷贝文件或目录

    includeemptydirs 是否拷贝空目录
    file             要拷贝的单个文件(只针对单个文件的拷贝,上例中没有指定该属性,而是通过内嵌<fileset>来指定多个文件)
    
    
  • javac 编译源文件

srcdir    源文件路径(多个源之间用:分隔,可通过内嵌<src>元素进行设定,如上例)
destdir   存放编译后的class文件路径
includes  包含的文件列表(多个列表用逗号或空格分隔,列表可用通配符指定)。该属性省略时,所有的.java文件被包含进去
excludes  排除的文件列表(多个列表用逗号或空格分隔,列表可用通配符指定)。
debug     编译时是否显示调试信息
includeantruntime 是否包含ant库路径
classpath 依赖库路径(上例中通过内嵌<classpath>元素进行了设定)

- jar 将class文件打成jar包
destfile  将创建的jar包位置
basedir   将被打成jar包的目录(或通过内嵌的<fileset>元素进行设定)
includes  包含的文件列表(多个列表用逗号或空格分隔,列表可用通配符指定)。该属性省略时,所有的文件被包含进去
excludes  排除的文件列表(多个列表用逗号或空格分隔,列表可用通配符指定)。
可内嵌<manifest>元素,通过设定Main-Class属性来设定jar包的入口类(如上例)

- war 将class文件打为war包
warfile 将创建的war包位置名称
webxml web项目web.xml的路径
classes 需要打进war包的字节码路径
fileset 需要拷贝的其他资源路径,如静态资源

- Resource Collections Ant中经常需要指定资源集合,主要通过下面元素指定fileset
dir    文件集合的根目录(该目录下的文件都会被包含)
file   快捷指定单个文件
includes  包含的文件列表(多个列表用逗号或空格分隔,列表可用通配符指定),该属性省略时,所有的文件被包含进去。
excludes  排除的文件列表(多个列表用逗号或空格分隔,列表可用通配符指定)。
casesensitive 指定包含或排除模式匹配时是否区分大小写,默认区分,可内嵌`<include>、<exclude>、<patternset>、<filename>`等元素。

- patternset 模式集合
id 唯一标识(其它<patternset>元素通过refid指向该模式)
可内嵌 `<include>、<exclude>、<includesfile>、<excludesfile>` 等元素

- include/exclude 指定单个模式(包含或排除)
name 要包含或排除的模式

- includesfile/excludesfile 指定模式文件
name 模式文件名(文件内容为包含或排除模式)

- Path-like Structures 在通过ant运行java类,或执行编译时,都需要指定classpath,可通过下面三个元素来指定引用的jar包或class文件
    - classpath 类路径,内嵌在<javac>,<java>等元素中,表示依赖库路径
    refid    指向该id对应的元素
    location 单个文件或目录(目录可以是相对路径或绝对路径,相对路径是指相对于工程的基准路径)
    path     多个location的集合(各location以冒号或分号进行分隔),一般用来引用预定义的路径,如引用环境变量${classpath},可内嵌<fileset>        
    <pathelement>等元素来指定jar文件或目录

    - path 类路径集合,被`<classpath>`或其它`<path>`引用。
    path用法类似<classpath>元素,但是<path>跟<target>同级,而classpath是内嵌在<java>或<javac>元素中。

    - pathelement 单个类路径,内嵌在`<classpath>`或`<path>`中
    location 单个文件或目录(目录可以是相对路径或绝对路径,相对路径是指相对于工程的基准路径)
    path     多个location的集合(各location以冒号或分号进行分隔),一般用来引用预定义的路径

##idea使用Ant
旧版本的idea可能自带这个功能,我是用idea2020没有这个插件,可以去插件管理下载`Ant Build Generation`,然后就可以在build菜单看到这个选项。
![](https://img2020.cnblogs.com/blog/1596294/202004/1596294-20200424165459333-1093548768.png)
可以利用这个插件来直接生成构建模板文件,根据具体情况做修改。

参考资料:https://blog.csdn.net/tang9140/article/details/45743791

猜你喜欢

转载自www.cnblogs.com/chsoul/p/12768385.html