现在很多项目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菜单看到这个选项。



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

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

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

使用Ant将项目打成war包的更多相关文章

  1. idea将项目打成war包

    idea将项目打成war包(转载) 2018年02月28日 20:08:03 沈行的专栏 阅读数:13773更多 个人分类: Java   首先点击这里进入项目的配置页面 在Artifacts栏里点击 ...

  2. 【Maven】项目打包-war包-Jar包[IDEA将项目打成war包]

    [Maven]项目打包-war包-Jar包[IDEA将项目打成war包] 2017年01月31日 00:21:06 阅读数:22912 标签: ideamaven发布博客插件 更多 个人分类: ❷ J ...

  3. 关于传统项目打成war包的的分析

    技术在不断的革新,以前的项目没有jar管理工具时,都是手动将依赖的jar拷贝到项目之下,然后Build Path,之后Maven出现了,出现了jar包中央仓库,所有的jar包资源集中在这里,免去频繁去 ...

  4. 如何将一个项目打成war包?

    如何将一个项目打成war包?进入该项目所在目录jar  -cvf  myProjec.war  myProject

  5. 将web项目打成war包部署在tomcat步骤

    将web项目打成war包部署在tomcat步骤 1.将自己的项目打成war包. 2.将打包好的war复制到${tomcat.home}/webapps项目下. 3.在${tomcat.hom}/con ...

  6. Web项目打成war包部署Tomcat时运行startup.bat直接闪退部署失败解决方案

    即上篇通过将web项目打成war包部署到Tomcat服务器,解决mysql问题后,又出现了新问题,真是一波三折,所以将解决过程分享给大家,希望能帮助到小伙伴们~ 将打好的war包拷贝到Tomcat的w ...

  7. springboot项目打成war包

    在某种情况下,比如..........之下,我们不得不,将springboot打成war包 1.在pom.xml文件中修改 <packaging>war</packaging> ...

  8. IDEA将web项目打成war包

    非Maven项目打包方式    按ctrl+滚动鼠标滚轮就能放大浏览器看图片了.或者将图片拖到新窗口打开. 然后点击OK,然后build一下.然后去classes文件夹下面找就能找到打成war包的项目 ...

  9. springboot将项目打成war包

    1. 将项目的打包方式改为war包 <groupId>com.cc</groupId> <artifactId>aaaaaa</artifactId> ...

随机推荐

  1. css和xpath定位补充

    定位的网页的地址:https://item.jd.com/100000323510.htmlxpath绝对定位: 1 以"/"开头的是绝对定位 2 /html/body/div[1 ...

  2. html的keywords标签

    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /& ...

  3. DateDiff() 方法语法 T-SQL语法

    表达式DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear]]) 允许数据类型: timeinterval 表示 ...

  4. 【Flutter 混合开发】与原生通信-MethodChannel

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  5. C# 将dataset数据导出到excel中

    //添加引用 NPOI.dll //添加 using NPOI.HSSF.UserModel; /// <summary> /// 导出数据到Excel /// </summary& ...

  6. 智能DNS的实现

    网络路径远,导致用户访问延迟 各个运营商之间的带宽有阀口. GSLB 就近的返回服务器的地址 CDN网络 内容分发网络 Content Delivery Network CND服务商 阿里 腾讯 蓝汛 ...

  7. 市场清仓价格算法 python求矩阵不同行不同列元素和的最大值

    问题描述 求矩阵不同行不同列元素和的最大值(最小值) 问题求解 1.通过scipy库求解 scipy.optimize库中的linear_sum_assignment方法可以求解 输入一个矩阵,参数m ...

  8. 并发编程——多线程计数的更优解:LongAdder原理分析

    前言 最近在学习ConcurrentHashMap的源码,发现它采用了一种比较独特的方式对map中的元素数量进行统计,自然是要好好研究一下其原理思想,同时也能更好地理解ConcurrentHashMa ...

  9. 关于HDFS应知应会的N个问题 | 技术点

    1. Namenode的安全模式 ? 安全模式是Namenode的一种状态(Namenode主要有active/standby/safemode三种模式). 2. 哪些情况下,Namenode会进入安 ...

  10. LoRa技术的发展应用和LoRa应用设备

    LoRa技术的发展应用 LORA技术大约在十年前由法国和瑞士开发,到现今LORA技术已经是物联网发展应用中不可缺少的一部分,根据中国物联网研究与发展中心的数据,2025年我国物联网产业规模将达到2万亿 ...