Ant、Ivy入门与集成


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

Apache Ivy是一个优秀的管理(记录、跟踪、解析和报告)项目依赖的工具,可与Apache Ant紧密集成。

整理日志比敲代码还累委屈

资源准备

本文中的演示实例是基于Eclipse插件(Ivy插件叫IvyDE,Ant插件一般都自带)来编写的。主要包括Ivy依赖管理、Ant自动化测试与打包、Ant与Ivy集成三个部分。相关资源下载地址:http://pan.baidu.com/s/1i3D2AFj

新建Java项目

为了温习Java的反射机制,特意在项目中编写了4个Java文件:Demo.java、IDemo.java、Test.java、JunitTest.java。目录结构如下:


Ivy管理依赖

为了满足后面的自动化测试,我加入了JunitTest,故需要引入Junit的相关Jar包。在项目根目录下新增ivysettings.xml、ivy.xml两个文件。

ivysettings.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ivysettings>
	<settings defaultResolver="default"/>
	<property name="ivy.local.default.root"             value="${ivy.default.ivy.user.dir}/local" override="false"/>
	<property name="ivy.local.default.ivy.pattern"      value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
	<property name="ivy.local.default.artifact.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
	
	<caches useOrigin="true"/>
	
	<resolvers>
		<!--本地库-->
		<filesystem name="local">
			<ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}" />
			<artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}" />
		</filesystem>
		
		<!--缓存库-->
		<filesystem name="cache">
			<ivy pattern="${ivy.default.ivy.user.dir}/cache/[organisation]/[module]/[artifact]-[revision].xml" />
			<artifact pattern="${ivy.default.ivy.user.dir}/cache/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]" />
		</filesystem>
		
		<!--远程库 省略-->
		
		<chain name="default" returnFirst="true" checkmodified="true">
			<resolver ref="local"/>
			<resolver ref="cache"/>
		</chain>
	</resolvers>
</ivysettings>

注意:此配置生效需要在“C:\Users\****\.ivy2\cache”路径下存在ivy的缓存Jar包。

ivy.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info
        organisation="com.netbug"
        module="reflect"
        status="integration">
	</info>
	<configurations>
		<conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime"/>
		<conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/>
		<conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/>
		<conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/>
	</configurations>
	<dependencies>
		<!-- 单元测试相关 -->
		<dependency org="junit" name="junit" rev="4.10" conf="default" transitive="false" />
		<!-- json序列化相关 -->
		<dependency org="com.fasterxml.jackson.core" name="jackson-core" rev="2.3.1" conf="default" transitive="false"/>
		<dependency org="com.fasterxml.jackson.core" name="jackson-annotations" rev="2.3.1" conf="default" transitive="false"/>
		<dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.3.1" conf="default" transitive="false"/>
	</dependencies>
</ivy-module>

修改项目的ivy配置信息如下:注意ivysetting.xml。


右键ivy.xml,选择“Add Ivy Library…”。此时会出现如下界面:


点击“Finish”,项目的Build Path变化如下:


此时JunitTest.java编译应该就不会报错了。得意

Ant自动化测试与打包

首先将资源中的junit-4.10.jar复制到Ant插件安装目录的lib下,并配置Ant运行环境如下:


Ant的自动化测试需要另外提供junitJar包,如果不提供则会抛异常。

在项目根目录下新建“build.properties、build.xml”两个文件。对应的文件内容如下:

build.properties

#Tue, 14 Jul 2015 09:46:09 +0800
custom=true
build.dir=build
build.classes.dir=build/classes
build.lib.dir=build/lib
build.report.dir=build/report

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-test-project" default="default" xmlns:ivy="antlib:org.apache.ivy.ant">
	<description>
            description
    </description>
	<property file="build.properties">
	</property>
	<path id="cachepath">
		<fileset dir="lib" includes="**/*.jar">
		</fileset>
	</path>
	<target name="default" depends="jar" description="description" if="basedir">

	</target>

	<target name="property" description="Inside And Custom Property">
		<echo message="basedir:${basedir}" />
		<echo message="ant.file:${ant.file}" />
		<echo message="ant.project.name:${ant.project.name}" />
		<echo message="ant.version:${ant.version}" />
		<echo message="ant.java.version:${ant.java.version}" />
	</target>

	<target name="clean">
		<delete dir="${build.dir}">
		</delete>
	</target>

	<target name="init" depends="property,clean">
		<mkdir dir="${build.dir}" />
		<mkdir dir="${build.classes.dir}" />
		<mkdir dir="${build.lib.dir}" />
		<mkdir dir="${build.report.dir}" />
	</target>

	<target name="compile" depends="init">
		<javac srcdir="src" destdir="${build.classes.dir}" includeantruntime="true" classpathref="cachepath">
		</javac>
		<echo message="源文件编译成功!" />
	</target>
	<target name="compile.test" depends="compile">
		<javac srcdir="test" destdir="${build.classes.dir}" includeantruntime="true" classpathref="cachepath">
		</javac>
		<echo message="测试源文件编译成功!" />
	</target>

	<target name="test" depends="compile.test">
		<echo message="Junit测试开始!" />
		<junit printsummary="true" showoutput="true" fork="true">
			<classpath>
				<pathelement path="${build.classes.dir}" />
			</classpath>
			<formatter type="xml" />
			<batchtest todir="${build.report.dir}">
				<fileset dir="${build.classes.dir}">
					<include name="**/JunitTest.*" />
				</fileset>
			</batchtest>
		</junit>
		<echo message="Junit测试结束!" />
	</target>

	<target name="java" depends="test">
		<java classname="com.netbug.reflect.Test" classpath="${build.classes.dir}">
		</java>
		<echo message="组件运行成功!" />
	</target>

	<target name="jar" depends="java">
		<jar destfile="${build.dir}/com.netbug.reflect.jar">
			<fileset dir="${build.classes.dir}">
				<exclude name="**/JunitTest.*" />
			</fileset>
			<manifest>
				<attribute name="Main-class" value="com.netbug.reflect.Test" />
			</manifest>
		</jar>
		<echo message="组件打包成功!" />
	</target>
</project>

此时的项目目录结构如下:


右键“build.xml”-“Run AS Ant Build”,在根目录的build文件下会生成打包文件:com.***.reflect.jar以及自动化测试报告“report/TEST-com.netbug.reflect.JunitTest.xml”

Ant与Ivy集成

首先将资源中的ivy-2.3.0.jar复制到Ant插件安装目录的lib下,并配置Ant运行环境如下:


Ant与ivy集成需要另外提供ivy.jar包,如果不提供则会抛异常。

其后对build.xml做相应修改如下:

  • 注释掉cachepath

	<!-- <path id="cachepath">
		<fileset dir="lib" includes="**/*.jar">
		</fileset>
	</path>  -->


  • 新增init.ivy target

	<target name="init.ivy" description="init ivy">
		<ivy:settings file="ivysettings.xml" id="ivy.instance" />
		<ivy:cachepath pathid="cachepath" conf="*" type="jar,bundle,war,maven-plugin" />
		<ivy:retrieve conf="*" type="jar,bundle,war,maven-plugin" pattern="${build.lib.dir}/[conf]/[artifact].[ext]" />
		<ivy:report todir="${build.report.dir}" />
		<echo message="Ivy初始化成功" />
	</target>


  • 修改compile target基于init、init.ivy两个target

	<target name="compile" depends="init,init.ivy">
		<javac srcdir="src" destdir="${build.classes.dir}" includeantruntime="true" classpathref="cachepath">
		</javac>
		<echo message="源文件编译成功!" />
	</target>


右键“build.xml”-“Run AS Ant Build”,在根目录的build文件下会生成打包文件:com.***.reflect.jar、自动化测试报告“report/TEST-com.netbug.reflect.JunitTest.xml”以及“ivy依赖报告”。

最终的项目目录结构如下:


参考资料链接

http://www.blogjava.net/aoxj/archive/2009/08/03/289522.html

http://www.blogjava.net/zhangzhong1018/articles/142411.html

http://www.cnblogs.com/cyjch/archive/2012/03/28/2420761.html

http://blog.csdn.net/lisonghua/article/details/4770260

http://my.oschina.net/u/134516/blog/195569

Best Wishes For You!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值