ant增量编译打包java项⽬
不会⽤ant打包、部署项⽬的⼯程师,不是⼀个好程序员(测试)
副标题:利⽤ant脚本 ⾃动构建svn增量/全量 系统程序升级包
⾸先请允许我这样说,作为开发或,你⼀定要具备这种本领。你可以⼿动打包、部署你的⼯程,但这不是最好的⽅法。最好的⽅式就是全⾃动化的⽅式。开发⼈员提交了代码后,可以⾃动构建、打包、部署到测试环境。测试通过后进⼊到模拟环境或是直接发布的⽣产环境,这个过程可以是全⾃动的。但这个⾃动化的⽅式有⼀些公司⽤到了,但也有很多公司还不知道,他们的攻城师天天在做反复、没有多⼤意义的、浪费⽣命的事情。当然这种⽅式⼀般针对做⾃⼰的产品,如电商、通信⾏业。⽽给其他公司或企业做项⽬的⽐较少利⽤这种⽅式,当然也可以利⽤这种⽅式,只是不能直接发布到客户的服务器⽽已。当然有些公司是专门有⼈做这部分事情的!
说了这么多也没有什么恶意,只是觉得这种⽅式可以⼤⼤提⾼效率,降低⼈⼒、物⼒、财⼒⽽已。勿喷,O(∩_∩)O哈哈~嘿嘿~
在部署项⽬或打包项⽬中,通常⼤家都是⼿动部署或打包的多。很多公司把这⼀任务交个了我们做开发的,其实这部分应该谁做呢?
本质上应该是测试的来完成,但⼀些公司的测试不会做这个,慢慢的就变成了开发的事情。有些公司是⼈⼿⽐较少、不健全,所以⼀部分⼈⾃⼰承担了这个事情。在我们⼿动打包的时,其实这是⼀个重复的、没有技术含量的、耗费体⼒的活⼉。⼀般步骤就是更新svn 上代码、修改好相关的配置、编译class、发布到tomcat(web⼯程)、测试启动⽆误、⼿动打包。
⽽有⼀种⽐较简单快速的⽅式就是利⽤meven或ant来完成这些⼯作,只要我们编写好脚本后。给相关的⼯作⼈员去运⾏这部分脚本就可以完成打包,甚⾄是部署项⽬,这些都是so easy~!我个⼈也⽐较赞成使⽤这种⽅式,⽐较简单、快速、重⽤性好,最难的可能编写build脚本,但这个脚本其实也是很简单的,它就想dos命令⾏,只不过它是⽤xml⽅式来完成命令⾏的⽽已。所以测试会写ant的build脚本这个也是应该的,如果你不会的话,还是建议你学习学习。反正是百益⽆⼀害的事情,何乐⽽不为呢!
⼀、基本流程
利⽤ant打包项⽬或打增量包的基本流程
值得⼀提的是jar包这个部分,这个步骤是为下⾯编译增量包做准备的。因为增量包导出的增量⽂件,它依赖于整个项⽬的其他代码,如果没有这些代码的⽀持是编译不通过。然⽽⼜不能直接通过diff得到增量的class,所以只能导出增量⽂件后,通过引⽤全部⼯程的代码的class再进⾏编译即可。
⼆、运⾏环境
1、安装jdk,不会⾃⼰上⽹查其他的
会介绍⼀下ant的安装和使⽤的⽅法。
3、这⾥需要⽤到svn的ant相关⼯具包、命令⽀持。你需要下载,将⾥⾯的lib库放置在你的ant脚本的编译运⾏环境中。
4、因为某些项⽬使⽤到了泛型、annotation注解,使⽤javac有些代码是编译不通过的,所以这⾥使⽤了jdt的编译⽅式。参考: 会
有很详细的介绍。
需要⽤到
jdtCompilerAdapter.jar
<_3.3.3.v_793_R33x.jar
复制到ant_home/lib⽬录下,如果是利⽤eclipse运⾏脚本就需要把它加载到运⾏环境中。可以参考上⾯的:
三、编写ant的build脚本
1、⾸先看看ant⼯程的⽬录结构
简单介绍下⽬录结构:
src下⾯的ExportIncrementFiles.是导出增量⽂件要⽤的,它在build命令increment中执⾏。它会读取diff ⽐较后的⽂件中的内容,并导出⽂件
dest 是checkout出来最新的svn的⼯程
dist 是编译上⾯dest⽬录中的⼯程,也是svn全量war的⼯程⽬录和jar
increment_dest 是增量⼯程,也就是上⾯的ExportIncrementFiles⼯具导出的⼯程
increment_dist 是编译上⾯increment_dest 的⼯程,也是增量包的⼯程⽬录
因为每个⼈的项⽬⼯程⽬录结构不⼀样,所以这个脚本并不会通⽤,我这⾥指针对⾃⼰的项⽬进⾏测试。
lib中是运⾏环境需要的jar库,其中主要的就是svnlib 这个你可以去下载 以及JDT编译class的jar包,这个可以通过eclipse中的plugin中的jar包到,可以参考:
build.properties是当前build的配置⽂件
选中部分是打的war包,这个就可以部署了
<就是svn的diff ⽐较出的增量⽂件的⽬录路径列表
2、ExportIncrementFiles.java 导出增量⽂件
package com.hoo.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
/**
* <b>function:</b> 导出在增量的⽂件
* @author hoojo
* @createDate 2013-11-2 下午10:00:01
* @file ExportIncrementFiles.java
* @package com.hoo.util
* @project AntTest
* @blog blog.csdn/IBM_hoojo
*@*******************
* @version 1.0
*/
public class ExportIncrementFiles {
/**
* <b>function:</b> 导出增量⽂件
* @author hoojo
* @createDate 2013-11-2 下午10:15:43
* @param configPath 增量⽂件路径配置⽬录
* @param baseDir 基本路径⽬标位置
* @param destDir 增量⽂件保存位置
* @throws Exception
*/
private static void export(String configPath, String baseDir, String destDir) throws Exception {
String srcFile = baseDir + configPath;
String desFile = destDir + configPath;
int lastIndex = desFile.lastIndexOf("/");
String desPath = desFile.substring(0, lastIndex);
File srcF = new File(srcFile);
ists()){//如果不存在这样的源⽂件,就不再拷贝,这个⽤来解决版本之间有删除⽂件的情况。
File desF = new File(desFile);
File desP = new File(desPath);
File desP = new File(desPath);
if(!ists()) {
desP.mkdirs();
}
System.out.println(srcFile);
FileInputStream fis = new FileInputStream(srcF);
FileOutputStream fos = new FileOutputStream(desF);
byte[] buf = new byte[1024];
int len = 0;
while((len = ad(buf)) != -1) {
fos.write(buf,0,len);
}
fos.flush();
fos.close();
fis.close();
}
}
/**
* <b>function:</b> 主函数执⾏导出增量包任务
* @author hoojo
* @createDate 2013-11-2 下午10:00:01
* @param args 参数1 增量包导出⽂件路径,参数2 要导出的⽂件的所在⽬标位置,参数3 增量包导出保存的位置路径    */
public static void main(String[] args) {
if (args.length > 0) {
if (args.length == 1 && "help".equals(args[0])) {
System.out.println("args[0] is Export Increment Files content path");
System.out.println("args[1] is Export Increment Files target path");
System.out.println("args[2] is Increment Files Export loaction");
} else {
String configPath = args[0];
String baseDir = args[1];
String destDir = args[2];
try {
BufferedReader br = new BufferedReader(new FileReader(configPath));
String s = null;
while((s = br.readLine()) != null) {
s = s.trim();//去掉路径前⾯的空格
String str = destDir + s;
if(!destDir.equals(str)){//过滤空⾏
export(s, baseDir, destDir);
}
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
main函数参数看注释,主要就是读取增量⽂件路径,导出⽂件到指定⽬录的。
<!-- svn导出/切出⽂件编译后存放⽬录 -->
<property name="dist.path"location="dist/${webapp}"/>
<!-- svn增量⽂件保存⽬录 -->
<property name="increment.dest.path"location="increment_dest/${webapp}"/>
<!-- svn增量⽂件编译后保存⽬录 -->
<property name="increment.dist.path"location="increment_dist/${webapp}"/>
<!-- 利⽤jdt编译class 解决泛型不能转换的问题需要将
jdtCompilerAdapter.jar
<_3.3.3.v_793_R33x.jar
复制到ant_home/lib⽬录下
<property name="buildpiler" value="JDTCompilerAdapter"/>
-->
<path id="svnant.classpath">
<fileset dir="${basedir}">
<include name="**/*.jar"/>
</fileset>
</path>
<path id="buildpath">
<fileset dir="${dest.path}">
<include name="**/lib/*.jar"/>
</fileset>
<fileset dir="C:/Program Files/Java/jdk1.6.0_13">
<include name="**/*.jar"/>
</fileset>
</path>
<typedef resource="org/tigris/subversion/l"classpathref="svnant.classpath"/>
ant安装包<svnSetting id="svn.settings"javahl="false"svnkit="true"username="${svn.username}"password="${svn.password}"failonerror="true"/> <target name="init"description="init clean dirs">
<echo message="${svn.username}"/>
<echo message="${svn.password}"/>
<echo message="${webapp}"/>
<echo message="${webroot}"/>
<echo message="${compare.path.file}"/>
<delete dir="${dest.path}"failonerror="false"deleteonexit="true"excludes="**/lib"/>
<delete dir="${dist.path}"failonerror="false"deleteonexit="true"excludes="**/lib"/>
<delete file="${compare.path.file}"failonerror="false"/>
<delete dir="${increment.dest.path}"failonerror="false"deleteonexit="true"/>
<delete dir="${increment.dist.path}"failonerror="false"deleteonexit="true"/>
</target>
<!-- that is to test i svnant is available //-->
<target name="tool-available"depends="init">
<echo message="run task test svnant is available"></echo>
<available resource="org/tigris/subversion/l"classpathref="svnant.classpath"property="available.svnant"/> <echo message="SVN-ANT is available = ${available.svnant}"></echo>
</target>
<!-- ⽐较差异增量⽂件 -->
<target name="diff"description="deff/compare project">
<svn refid="svn.settings">
<diffSummarize oldUrl="${bak.svn.url}"newUrl="${svn.url}"outFile="${compare.path.file}"recurse="true"/>
</svn>
</target>
<!-- 下载切成导出服务器上最新代码 -->
<target name="checkout"depends="tool-available"description="checkout/export project code ${svn.url} ">
<echo message="checkout/export project code ${svn.url}"></echo>
<svn refid="svn.settings">
<export srcUrl="${svn.url}"destPath="${dest.path}"revision="HEAD"force="true"/>
</svn>
</target>
<!-- javac编译 -->
<target name="compile">
<buildnumber/>
<echo>compile ${dest.path} ......</echo>
<delete dir="${dist.path}"failonerror="false"deleteonexit="true"excludes="**/lib"/>
<mkdir dir="${dist.path}/classes"/>
<javac nowarn="true"debug="${javac.debug}"debuglevel="${javac.debuglevel}"destdir="${dist.path}/classes"source="${javac.source}" target="${javac.target}"encoding="utf-8"fork="true"memoryMaximumSize="512m"includeantruntime="false">
<src path="${dest.path}/src"/>
<!--
<compilerarg value="-Xlint:unchecked"/>
<compilerarg value="-Xlint:deprecation"/>
<compilerarg value="-Xlint"/>
-->
<classpath refid="buildpath"/>
<classpath refid="svnant.classpath"/>
</javac>
</target>
<!-- 利⽤JDT编译 -->
<target name="compile_jdt">
<target name="compile_jdt">
<buildnumber/>
<echo>compile ${dest_path} ......</echo>
<delete dir="${dist_path}"failonerror="false"deleteonexit="true"excludes="**/lib"/>
<mkdir dir="${dist_path}/classes"/>
<javac compiler="JDTCompilerAdapter"nowarn="true"debug="${javac.debug}"de
buglevel="${javac.debuglevel}" destdir="${dist_path}/classes"source="${javac.source}"target="${javac.target}"encoding="utf-8"fork="true"memoryMaximumSize="512m" includeantruntime="false">
<src path="${dest_path}/src"/>
<classpath refid="buildpath"/>
<classpath refid="svnant.classpath"/>
</javac>
</target>
<!-- 利⽤JDT编译SVN 最新项⽬ -->
<target name="compile_svn">
<!-- 回调任务 -->
<antcall target="compile_jdt">
<param name="dest_path"value="${dest.path}"/>
<param name="dist_path"value="${dist.path}"/>
</antcall>
</target>
<!-- 将全部项⽬的class 建⽴jar包 -->
<target name="jar"depends="compile_svn">
<jar destfile="${basedir}/lib/${webapp}.jar"level="9"compress="true"encoding="utf-8"basedir="${dist.path}/classes">
<manifest>
<attribute name="Implementation-Version"value="Version: 2.2"/>
</manifest>
</jar>
</target>
<!-- 导出增量⽂件 -->
<target name="increment"depends="diff">
<java classname="com.hoo.util.ExportIncrementFiles"classpath="${basedir}/port.jar"fork="true">
<arg value="${compare.path.file}"/>
<arg value="${dest.path}/"/>
<arg value="${increment.dest.path}/"/>
</java>
</target>
<!-- 利⽤JDT编译增量⽂件 -->
<target name="compile_increment">
<antcall target="compile_jdt">
<param name="dest_path"value="${increment.dest.path}"/>
<param name="dist_path"value="${increment.dist.path}"/>
</antcall>
</target>
<!-- 全部打包 -->
<target name="war">
<echo>create </echo>
<copy todir="${dist_path}"failonerror="false">
<fileset dir="${dest_path}/${webroot}"includes="**"/>
</copy>
<move todir="${dist_path}/WEB-INF/classes"failonerror="false">
<fileset dir="${dist_path}/classes"/>
</move>
<copy todir="${dist_path}/WEB-INF/classes"failonerror="false">
<fileset dir="${dest_path}/src/main/"includes="**/*.xml, **/*.properties, **/*.xsd"/>
<fileset dir="${dest_path}/src/test/"includes="**/*.xml, **/*.properties, **/*.xsd"/>
<fileset dir="${dest_path}/src/resource/"includes="**/*.xml, **/*.properties, **/*.xsd"/>
</copy>
<!--得到当前⽇期-->
<tstamp>
<format property="DSTAMP"pattern="yyyyMMdd"locale="zh"/>
<format property="TSTAMP"pattern="HHmmss"locale="zh"/>
</tstamp>
<war destfile="${basedir}/${webapp}_${DSTAMP}_${TSTAMP}.war"basedir="${dist_path}"webxml="${dist_path}/l"/> </target>
<!-- 全部打包 -->
<target name="war_svn">
<antcall target="war">
<param name="dest_path"value="${dest.path}"/>
<param name="dist_path"value="${dist.path}"/>
</antcall>
</target>
<!-- 全部打包 -->
<target name="war_increment">
<copy todir="${increment.dist.path}/WEB-INF"file="${dest.path}/${webroot}/l"/>
<antcall target="war">
<param name="dest_path"value="${increment.dest.path}"/>
<param name="dist_path"value="${increment.dist.path}"/>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。