`

扩展ant功能,自动分析eclipse文件制作war包

阅读更多

以前都是用maven2做项目管理,但最近又用回了ant脚本执行打包,发现每次改变工程得jar依赖后打war包很麻烦,还得手工改变build.xml中的引用,所以为了偷懒就的相隔一劳永逸的办法,于是产生了如下偷懒的代码(可能技术进步都是因为我们想从无意义的手工劳动中解脱出来

1.扩展的ant类,分析classpath文件,替换变量M2_REPO以获得依赖jar的全路径,并执行copy

java 代码
 
  1. import  java.io.FileInputStream;  
  2. import  java.io.FileNotFoundException;  
  3. import  java.io.IOException;  
  4. import  java.util.ArrayList;  
  5. import  java.util.Iterator;  
  6. import  java.util.List;  
  7.   
  8. import  org.apache.tools.ant.BuildException;  
  9. import  org.apache.tools.ant.Project;  
  10. import  org.apache.tools.ant.Task;  
  11. import  org.apache.tools.ant.util.FileUtils;  
  12. import  org.dom4j.Document;  
  13. import  org.dom4j.Element;  
  14. import  org.dom4j.io.SAXReader;  
  15.   
  16.   
  17. /**  
  18.  * 类说明: 分析.classpath文件的jar引用,并copy到war
     
  19.  * 创建时间: 2007-10-31 下午02:23:42
     
  20.  * @author Seraph
     
  21.  * @email: seraph115@gmail.com
     
  22.  */   
  23. public   class  AntPathTask  extends  Task {  
  24.       
  25.     private   static   final  String M2_REPO =  "M2_REPO" ;  
  26.       
  27.     private   static   final  String ECLIPSE_DOM =  "/classpath/classpathentry" ;  
  28.   
  29.     private  String libdir;  
  30.       
  31.     private  String repository;  
  32.       
  33.     private  String classpath;  
  34.   
  35.     public  String getLibdir() {  
  36.         return  libdir;  
  37.     }  
  38.   
  39.     public   void  setLibdir(String libdir) {  
  40.         this .libdir = libdir;  
  41.     }  
  42.   
  43.     public  String getRepository() {  
  44.         return  repository;  
  45.     }  
  46.   
  47.     public   void  setRepository(String repository) {  
  48.         this .repository = repository;  
  49.     }  
  50.   
  51.     public  String getClasspath() {  
  52.         return  classpath;  
  53.     }  
  54.   
  55.     public   void  setClasspath(String classpath) {  
  56.         this .classpath = classpath;  
  57.     }  
  58.       
  59.     public  Project getProject() {  
  60.         return   super .getProject();  
  61.     }  
  62.   
  63.     public   void  execute()  throws  BuildException {  
  64.           
  65.         List list = getPathFromEclipseFile();  
  66.         copyJar(list);  
  67.         showPath(list);  
  68.     }  
  69.       
  70.     public  List getPathFromEclipseFile() {  
  71.           
  72.         SAXReader saxReader = new  SAXReader();  
  73.         Document document = null ;  
  74.         try  {  
  75.             document = saxReader.read(new  FileInputStream(classpath));  
  76.         } catch  (Exception e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.   
  80.         List list = document.selectNodes(ECLIPSE_DOM);  
  81.         List pathList = new  ArrayList();  
  82.           
  83.         int  i =  0 ;  
  84.         for  (Iterator iterator = list.iterator(); iterator.hasNext();) {  
  85.              Element element= (Element) iterator.next();   
  86.                
  87.              String kind = element.attributeValue("kind" );  
  88.              if ( "var" .equals(kind)){  
  89.                  String path = element.attributeValue("path" );  
  90.                  path = path.replaceAll(M2_REPO, repository);  
  91.                  pathList.add(path);  
  92.                  i++;  
  93.              }  
  94.         }  
  95.         return  pathList;  
  96.     }  
  97.       
  98.     public   void  copyJar(List list) {  
  99.           
  100.         FileUtils fileUtils = FileUtils.newFileUtils();  
  101.         for  (Iterator iterator = list.iterator(); iterator.hasNext();) {  
  102.             String fileName = (String) iterator.next();  
  103.             String[] strs = null ;  
  104.             try  {  
  105.                 strs = fileName.split("/" );  
  106.                 String destFile = libdir + "/"  + strs[strs.length -  1 ];  
  107.                 fileUtils.copyFile(fileName, destFile, null true );  
  108.             } catch  (FileNotFoundException e1) {  
  109.                 log("指定的变量[M2_REPO]路径下找不到所需Jar,请配置正确路径。所需文件:"   
  110.                         + strs[strs.length - 1 ], Project.MSG_ERR);  
  111.             } catch  (IOException e2) {  
  112.                 e2.printStackTrace();  
  113.             }  
  114.         }  
  115.     }  
  116.   
  117.     public   void  showPath(List list) {  
  118.       
  119.         log("Find .classpath file path of eclipse is: \""  + classpath +  "\"" );  
  120.         log("CRMS Project include jar files: " );  
  121.   
  122.         for  (Iterator iterator = list.iterator(); iterator.hasNext();) {  
  123.             String path = (String) iterator.next();  
  124.             log(path);  
  125.         }  
  126.         log("Total of jar files: "  + list.size());  
  127.     }  
  128. }  


2.ant的build.xml文件,使用扩展的ant任务taskdef,其中M2_REPO是eclipse的变量,而工程所引用的依赖都是通过此变量添加到工程中的

 

<?xml version="1.0" encoding="UTF-8"?>
<project name="crms" default="clean-jar" basedir=".">

	<property name="M2_REPO" value="D:/repository" />
	<property name="abator.dir" value="${M2_REPO}/abator/abator/1.0.0" />
	<property name="ant-extend.dir" value="${M2_REPO}/ant-extending/ant-extending/1.0.0" />
	<property name="build.dir" location="target/classes" />
	<property name="webapp.dir" value="src/main/webapp" />
	<property name="resources.dir" value="src/main/resources" />
	<property name="classpath.dir" location=".classpath" />
	<property name="lib.dir" value="${webapp.dir}/WEB-INF/lib" />
	<property name="generated.source.dir" value="${basedir}" />

	<!-- - - - - - - - - - - - - - - - - - 
          import: Ant> Runtime> Global Entries> dom4j1.6; jaxen1.1;
         - - - - - - - - - - - - - - - - - -->
	<taskdef name="createPath" classname="com.seraph.extending.AntPathTask" classpath="${ant-extend.dir}/ant-extending-1.0.0.jar" />

	<!-- - - - - - - - - - - - - - - - - - 
          target: 通过自动分析.classpath文件中的引用,拷贝jar包
         - - - - - - - - - - - - - - - - - -->
	<target name="copy-jar">
		<createPath libdir="${lib.dir}" repository="${M2_REPO}" classpath="${classpath.dir}" />
	</target>

	<target name="create-war" depends="copy-jar">
		<war destfile="crms.war" webxml="${webapp.dir}/WEB-INF/web.xml">
			<fileset dir="${webapp.dir}" />
			<classes dir="${build.dir}" />
		</war>
	</target>

	<target name="clean-jar" depends="create-war">
		<delete dir="${lib.dir}" />
	</target>

	<!-- - - - - - - - - - - - - - - - - - 
          target: Abator ORM 生成器
         - - - - - - - - - - - - - - - - - -->
	<target name="abator" description="Generate the ibatis files">
		<taskdef name="abator"
	                classname="org.apache.ibatis.abator.ant.AbatorAntTask"
	                classpath="${abator.dir}/abator-1.0.0.jar" />
		<abator overwrite="flase" configfile="${resources.dir}/abatorConfig.xml" verbose="false" >
			<propertyset>
				<propertyref name="generated.source.dir"/>
			</propertyset>
		</abator>
	</target>

</project>
 

 

3.在运行时需在eclipse的ant运行环境中,加入dom4j,saxpath及jaxen包的引用

4.好了可以看看屏幕上的输出了,war很快就打好了

 

PS: 开发Ant扩展时在Eclipse中的调试方法:

 

Run Configurations>Java Application

 

创建一个java application,Main选项卡中的Project项中选自己扩展Ant所在的项目,Main Class项中添入“org.apache.tools.ant.Main

 

在Arguments选项卡中的Project Arguments中添入“-f  "[your build.xml path] [your task name] "
如:-f "/Users/seraph/Workshop/workspace/ant-extending/build.xml" copy-jar”

 

最后:Run

 

 

God bless you.

 

分享到:
评论

相关推荐

    ant打包编译全套资料

    Ant以其灵活性和可扩展性,通过XML格式的构建文件(build.xml)来定义任务,使得开发者能够自动化执行各种构建过程。 在Ant中,"标签"是构建文件的核心元素,它们定义了具体的任务和操作。例如,`&lt;project&gt;`标签是...

    Eclipse 与Ant 资料

    当需要编译项目时,只需在 Eclipse 的构建配置中指定 Ant 目标,Eclipse 就会自动调用 Ant 执行相应的任务,如编译源代码、生成 JAR 包或 WAR 包。同时,Eclipse 还会显示 Ant 构建的输出信息,方便开发者追踪错误和...

    ant打包部署工具,官方下载

    3. **打包JAR/WAR**:Ant能够将编译后的类文件和其他资源打包成JAR或WAR文件,这对于创建可分发的Java应用或Web应用至关重要。 4. **运行测试**:Ant支持JUnit和其他测试框架,可以自动化执行单元测试和集成测试,...

    利用ant脚本 自动构建svn增量.docx

    - **测试**:对新构建的包进行自动化测试,确保功能正常。 - **部署**:测试通过后,自动部署到测试或生产环境。 **运行环境与依赖** - **JDK**:安装并配置Java开发环境,为Ant提供基础支持。 - **Ant**:安装...

    演示ANT工具的Eclipse项目AntAdvanceDemo

    - ANT自身提供了一些基本任务,但通过引入额外的ANT插件,可以扩展更多的功能,比如Maven插件、 Ivy插件用于依赖管理。 - 项目"AntAdvanceDemo"可能使用了某些插件来增强其构建能力。 8. **ANT的执行** - 在...

    ANT-build-xml文件详解

    - **dist**:发布后的产品文件,如jar包、war包等。 6. **构建流程** - 编写build.xml:定义项目结构,包括目标和任务。 - 执行Ant:通过命令行调用ant,可指定目标,默认执行default指定的目标。 - 目标执行:...

    Ant基本应用教程学习

    总之,Apache Ant作为一个功能全面且灵活的Java构建工具,非常适合于Java项目的构建自动化。通过简单的配置和XML语法,用户可以轻松地将重复的构建任务自动化,从而使得整个开发过程更加高效和规范。

    Ant 打包Demo

    Ant基于XML文件(通常命名为build.xml)来定义构建过程,包括编译源代码、创建JAR或WAR文件、运行测试、清理工作目录等任务。其主要优点在于灵活性和可定制性,能够适应不同项目的需求。 **二、Eclipse集成Ant** ...

    Eclipse中使用Ant

    - `dist`:存放最终的可部署包,如`.jar`或`.war`文件。 - `doc`:存放生成的API文档。 #### 创建`build.xml`文件 `build.xml`是Ant的核心配置文件,用于定义构建过程中的任务流。在Eclipse项目根目录下创建`build...

    Eclipse 常用技巧功能

    - 可以直接在Eclipse中运行和调试应用程序,或者打包成可部署的WAR或JAR文件。 熟练掌握这些Eclipse的技巧和功能,可以显著提高开发效率,减少出错的可能性,让编程变得更加高效和愉快。对于专业的开发人员来说,...

    在eclipse中使用ant灵活构建web应用.docx

    在Java开发环境中,Eclipse是一个广泛使用的集成开发环境(IDE),而Ant则是一个基于Java的构建工具,用于自动化软件构建过程。本篇文章将详细介绍如何在Eclipse中利用Ant灵活构建Web应用程序。 首先,Ant是Apache...

    eclipse3.3中文包.rar

    - **构建工具**:通过插件如Maven或Ant,Eclipse能够自动化构建项目,生成可部署的JAR或WAR文件。 4. **Eclipse 3.3的扩展**: - Eclipse的开放架构允许用户通过安装插件来扩展其功能。例如,可以添加支持Python...

    ant.jar________打包工具

    Ant.jar的使用并不复杂,开发者只需要编写符合规范的build.xml文件,然后通过命令行运行`ant [target]`,Ant就会根据文件中的定义自动执行相应的构建任务。此外,大多数现代Java IDE,如Eclipse和IntelliJ IDEA,都...

    Ant详细配置总结

    Ant是Apache旗下的一款强大的构建工具,主要用于Java项目的自动化构建过程,如编译、测试、打包、部署等操作。它的核心优势在于其高度的可定制性和灵活性,使得开发者能够通过简单的XML配置文件(通常命名为`build....

    贯通Java Web开发三剑客Eclipse+Tomcat+Ant整合开发.(党海峰)

    3. **Eclipse与Ant集成**:在Eclipse中导入Ant项目,使用Eclipse的Ant视图管理和运行构建脚本,以及配置自动构建触发器。 4. **项目部署**:利用Ant将Web应用部署到Tomcat服务器,包括发布WAR文件到Tomcat的webapps...

    Apache Ant 教程 - 极客学院

    在构建和部署过程中,Ant能够自动执行诸如编译代码、封装二进制文件、在测试服务器上部署、测试变更以及代码复制等任务。这些任务是开发者日常工作中的常规活动,因此了解构建工具的使用是非常重要的。 Ant的历史...

    ant权威指南中英文双版本

    - **自定义任务**:通过编写Java类实现自定义任务,扩展Ant的功能。 - **宏定义**:宏定义允许定义一组任务,方便多次使用,类似于函数或模板。 - **外部资源管理**:Ant可以处理各种类型的文件和资源,如XML、...

    Apache-ANT完美详解

    - **打包**:Ant支持创建JAR、WAR和EAR等不同类型的归档文件。 - **测试**:可以集成JUnit或其他测试框架进行单元测试。 - **部署**:发布应用程序到远程服务器或应用服务器。 - **清理**:清除构建过程中产生的...

    ant使用手册(中文教程)

    - 使用`war`任务可以打包Web应用程序为WAR文件,适用于部署到Web服务器。 - 可以通过`ivy`(Apache Ivy)模块来管理和下载依赖库,类似于Maven的POM。 6. **Ant的扩展** - **Ant贡献任务(Contrib Tasks)**:...

Global site tag (gtag.js) - Google Analytics