使用Ant将项目打成war包

时间:2023-03-09 04:43:35
使用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 根节点,代表一个工程

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

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

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

    dir 创建目录的名称
  • delete 删除目录或文件

    dir 表示要删除的目录,该目录下的文件和子目录都会被删除
    file 表示要删除的文件
  • echo 向屏幕或文件输出信息

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

    todir 表示拷贝到哪个目录下
    includeemptydirs 是否拷贝空目录
    file 要拷贝的单个文件,也可以通过内嵌<fileset>来指定多个文件)
  • javac 编译源文件

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

使用Ant将项目打成war包

可以利用这个插件来直接生成构建模板文件,根据具体情况做修改。

初次使用,进一步的使用有待研究。

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