Contenu connexe Similaire à 基于Ivy ant的java构建初探 Similaire à 基于Ivy ant的java构建初探 (20) 基于Ivy ant的java构建初探2. 选择Ivy的N个理由
使用Ivy
系统构建步骤
系统构建规范
Ivy Resources
2012-6-20 杭州斯凯网络科技有限公司 2
3. Java构建的进化过程
直接在lib中添加jar包
初期 1. 直接使用IDE导出
2. 使用Ant来构建
定义userlibraries,包含jar包声明
过渡 1. 使用Ant构建
使用Ivy、Maven统一管理依赖
现在 1. 使用Ant+Ivy构建
2. 使用Maven构建
。。。。。。
未来
2012-6-20 杭州斯凯网络科技有限公司 3
4. Apache Ivy
Apache Ivy™ is a popular dependency manager
focusing on flexibility and simplicity.
Apache Ivy 是Apache Ant 下的一个子项目。是
一个优秀的管理(记彔、跟踪、解析和报告)
项目依赖的工具,提供了强大的依赖管理功
能,可与Apache Ant紧密集成。
2012-6-20 杭州斯凯网络科技有限公司 4
5. 功能
能够和Apache Ant紧密集成
支持多个不同的依赖存储
依赖报告Dependency Reporting
支持持续集成
强大的冲突管理功能
reference:http://ant.apache.org/ivy/features.html
2012-6-20 杭州斯凯网络科技有限公司 5
6. Ant+Ivy VS Maven
Maven Ant+Ivy
概念 项目管理工具 项目构建工具
+依赖管理工具
标准构建文件 project.xml、maven.xml build.xml
标准依赖文件 pom.xml ivy.xml
学习成本 需要重新学习 目前项目中大多使用Ant
曲线比较大 构建,只需要接入Ivy
2012-6-20 杭州斯凯网络科技有限公司 6
8. 选择Ivy的N个理由
使用Ivy
系统构建步骤
系统构建规范
Ivy Resources
2012-6-20 杭州斯凯网络科技有限公司 8
9. 环境安装
安装 ANT
配置环境变量:
ANT_HOME::D:Javadevapache-ant
PATH:%ANT_HOME%bin,(为了方便在命令行下操作)
下载Ivy
将下载的ivy安装包解压,然后复制ivy的jar文件到ant的
lib目彔下(ANT_HOME/lib)。
转到ivy解压的src/example/hello-ivy目彔并运行ant,检
验环境是否配置成功。
2012-6-20 杭州斯凯网络科技有限公司 9
10. IDE集成
Eclipse
Apache IvyDE
Intellij IDEA
IvyIDEA
Ivy Plugin
目前Eclipse的支持较好,其他IDE的支持正在改善中
2012-6-20 杭州斯凯网络科技有限公司 10
11. 术语
术语 描述
Organisation 组织名
Module 模块
Module Descriptor 模块描述符
Artifact 制品
Type of an artifact 制品类型
Artifact file name extension 制品文件扩展名
Module Revision 模块修订版本
Branch 分支
Status of a revision 修订本状态
Configurations of a module 模块配置
Ivy Settings ivy设置
Repository 仓库
2012-6-20 杭州斯凯网络科技有限公司 11
14. 选择Ivy的N个理由
使用Ivy
系统构建步骤
系统构建规范
Ivy Resources
2012-6-20 杭州斯凯网络科技有限公司 14
16. build.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--ant 脚本文件 -->
<project name="rop-mis" basedir=".">
<!--设置下面要用到的属性-->
<property name="module.name" value="${ant.project.name}" />
<property name="module.version" value="1.0.0" />
<property name="devconf.url" value="http://stcdev.sky-mobi.com:8080/devconf" />
<property name="app.buildfile" value="build-app.xml" />
<!-- import file="../allconf/${app.buildfile}" as=“impl"/ -->
<import as="impl">
<url url="${devconf.url}/${app.buildfile}"/>
</import>
</project>
其中import标签,需要ant添加组件jar,可以到
https://svn2.sky-mobi.com:9991/svn/netdevpublic/TOOLS
下载已经集成的Ant
2012-6-20 杭州斯凯网络科技有限公司 16
17. 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="skymobi.app"
module="${module.name}"
revision="1.0.0"
status="release"
publication="20101124120000">
<description homepage="http://stcdev.sky-
mobi.com/redmine/projects/${module.name}">
Skymobi app:${module.name}
</description>
</info>
<configurations>
<conf name="compile" visibility="public"/>
<conf name="test" visibility="private" extends="compile" />
<conf name="runtime" visibility="public" extends="compile" />
<conf name="develop" visibility="public" extends="compile" />
</configurations>
2012-6-20 杭州斯凯网络科技有限公司 17
18. ivy.xml
<publications>
<artifact name="rop-mis" type="jar" ext="jar" conf="compile"/>
<artifact name="rop-mis" type="source" ext="jar" conf="develop"/>
<artifact name="rop-mis" type="javadoc" ext="jar" conf="develop"/>
<artifact name="rop-mis" type="distribution" ext="zip" conf="runtime"/>
</publications>
<dependencies>
<dependency org="skymobi.stc" name="stc-util"
rev="latest.release" conf="compile"/>
<dependency org="skymobi.stc" name="stc-bean"
rev="latest.release" conf="compile"/>
<dependency org="com.oracle" name="oracle-jdbc-classes12"
rev="10.2.0.1.0" conf="runtime->default(*)"/>
<dependency org="junit" name="junit"
rev="4.8.2" conf="test->default(*)"/>
<dependency org="skymobi.stc" name="stc-unit-repo"
rev="snapshot" conf="compile" transitive="false" changing="true"/>
<dependencies>
</ivy-module>
2012-6-20 杭州斯凯网络科技有限公司 18
19. ivy.xml
属性 描述 基数
info 包含被描述的模块的信息 1
configurations 配置元素的容器 0..1
publications 发布制品元素的容器 0..1
dependencies 依赖元素的容器 0..1
其中需要改变的是dependencies中的dependency标签,对依赖文件进行管理
属性 描述 是否必须
org 依赖的organisation名称 否,默认与模块organisation相同
name 依赖的module名称 是
rev 依赖的版本号 是
conf 内联映射配置 否
transitive true时,递归解析依赖 否,默认为true
changing true时,依赖不受版本控制 否,默认false
2012-6-20 杭州斯凯网络科技有限公司 19
20. 添加到classpath
1. 右键ivy.xml,Add Ivy Library
2. Classpath添加ivy依赖,选择项目->右键属性->Java Build Path->Libraries->Add
Library...->IvyIDE Managed Dependencies->finish->OK
2012-6-20 杭州斯凯网络科技有限公司 20
22. 选择Ivy的N个理由
使用Ivy
系统构建步骤
系统构建规范
Ivy Resources
2012-6-20 杭州斯凯网络科技有限公司 22
24. 目录结构
1. 程序目彔 2. 脚本目彔
目彔 描述 目彔 描述
srcmainjava 主程序 bsh BeanShell脚本
srcmainresource 主程序的配置文件 hyperic hyperic配置
srctestjava 测试程序 sh Shell脚本
srctestresource 测试程序的配置文件 sql Sql脚本
manifest MANIFEST.MF文件
3. 功能单元配置目彔
目彔 描述
private 私有单元配置文件
public 公有单元配置文件
2012-6-20 杭州斯凯网络科技有限公司 24
25. Ant Task
根据build.xml中声明,import一个build-app.xml,该文件声明ant的
构建任务,svn地址:
https://svn2.sky-mobi.com:9991/svn/netdevpublic/allconf/build-
app.xml
build-app.xml中声明的重要的Ant Task
任务 定义 依赖(depends)
resolve 解析依赖
report 生成依赖报告 resolve
init 初始化目彔
prepare-dep hudson构建的变量设置 …
compile 执行编译Java文件 resolve、report、prepare-dep、init
compile-test 执行编译Java测试文件 init
clean-all 清理target目彔
2012-6-20 杭州斯凯网络科技有限公司 25
26. Ant Task
任务 定义 依赖(depends)
clean-deploy 清理classes目彔
run-test 运行测试用例 compile、compile-test
jar 生成jar包 clean-all、compile、run-test
jar-test 生成jar-test包 jar、compile-test
source-jar 生成源码包 jar
doc-jar 生成doc包 jar
clean-deploy 清理classes目彔
make-bin 生成bin目彔 jar
make-dist 生成项目zip make-bin、doc-jar
publish-snapshot 发布snapshot版本 make-dist,jar,source-jar,doc-jar
publish-release 发布release版本 make-dist,jar,source-jar,doc-jar
2012-6-20 杭州斯凯网络科技有限公司 26
27. build-app.xml
使用ivy,最频繁的方式是在Ant构建文件中,如果使用的Ant为
1.6.0版本或以上,只需要添加ivy的命名空间到项目中(project标签的属
性) xmlns:ivy="antlib:org.apache.ivy.ant“
<project xmlns:ivy="antlib:org.apache.ivy.ant" >
ivy setting
<ivy:settings url="http://stcdev.sky-mobi.com:8080/devconf/ivysettings.xml" />
如果不设置ivysetting,默认读http://ant.apache.org/ivy/history/latest-
milestone/samples/ivysettings-default.xml
2012-6-20 杭州斯凯网络科技有限公司 27
28. build-app.xml
<target name="resolve"
description="--> retreive dependencies with ivy">
<ivy:retrieve
pattern="${module.target}/lib/[conf]/[artifact]-[revision]-[type].[ext]"
conf="compile,test,runtime"
type="jar,bundle" />
</target>
ivy:retrieve任务复制解析好的依赖到你的文件系统的任何位置,它是
一个post resolve任务,拥有post resolve任务共有的所有的行为和属
性。
2012-6-20 杭州斯凯网络科技有限公司 28
29. retrieve
属性 描述 必须
pattern 用来复制依赖的正则表达式 No,默认${ivy.retrieve.pattern}
conf 用于获取配置的列表,逗号分隔 No,
type 可以接受的制品类型 No,默认为所有类型都接受
pattern="${module.target}/lib/[conf]/[artifact]-[revision]-[type].[ext]“
获取最后一次解析调用的所有依赖到lib目彔中,依赖将分隔在按照组织命
名的目彔中,每个conf目彔包含对应的带修订版本和制品类型依赖
conf="compile,test,runtime“
声明了三个配置compile、test、runtime,那么lib目彔应该是这样的:
lib
compile
stc-bean-1.0.6-jar.jar
test
stc-bean-1.0.6-jar.jar
runtime
stc-bean-1.0.6-jar.jar
2012-6-20 杭州斯凯网络科技有限公司 29
30. post resolve tasks
在ivy中有几个任务被认为是后解析任务(post resolve task),并相应地共
享公用行为和设置。这些任务是:
retrieve
cachefileset
cachepath
artifactproperty (since 2.0)
artifactreport (since 2.0)
所有这些任务都将自动触发resolve
2012-6-20 杭州斯凯网络科技有限公司 30
31. resolve
解析在ivy.xml文件中描述的依赖,并将解析后的依赖放置到ivy缓
存中。
ivy缓存默认为user.home/cache目彔,它通过下面的方式确定路
径:
1. 查找变量ivy.cache.dir
2. 如果没有找到,使用ivy.default.ivy.user.dir/cache
ivy.default.ivy.user.dir默认情况使用user.home
所以要改变cache目彔,在build.xml设置
<property name="ivy.default.ivy.user.dir" value="D:ivy" />
当ivy完成解析任务时,它将输出概要:
2012-6-20 杭州斯凯网络科技有限公司 31
32. resolve
Tag tag 模式
modules
number 配置下被解析的依赖模块的总数目,包括间接的依赖
search 需要访问仓库的依赖模块的数目
dwnlded 从仓库下载的依赖模块的数目
evicted 冲突管理器筛选出依赖模块的数目
artifacts
number 配置下被解析的制品的总数目
dwnlded 从仓库实际下载的制品数目
2012-6-20 杭州斯凯网络科技有限公司 32
34. publish
属性 描述 必须
resolver 用来发行制品的解析器名称 是
No,默认
artifactspattern 用于查找发行制品的正则表达式
${ivy.publish.src.artifacts.pattern}
用于查找发行制品ivy文件的正 No,默认与artifactspattern
srcivypattern
则表达式 相同
pubrevision 用于发行的修订颁布 No,默认为${ivy.deliver.revision}
true 时 在 发 行 前 更 新 ivy 文 件 的 No,默认为false
update
metadata,false相反
true时覆盖仓库中修订版本一样 No,默认为false
overwrite
的文件,false相反
status 发行的status No,默认${ivy.status}
publish-snapshot与publish-release,区别在于用的resolver, resolver
的声明在ivysettings.xml中可以找到。
2012-6-20 杭州斯凯网络科技有限公司 34
36. 目录结构
目彔结构
术语 描述
src 程序目彔
resources 程序配置文件
WebContent(WebRoot) web目彔
2012-6-20 杭州斯凯网络科技有限公司 36
37. build.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project name="sup-cms" basedir=".">
<!--property name="ivy.default.ivy.user.dir" value="D:ivy" /-->
<!--设置下面要用到的属性-->
<property name="module.name" value="${ant.project.name}" />
<property name="module.version" value="1.0.0" />
<!-- 不同IDE工程的Webcontent不同-->
<property name="web.content" value="WebContent"/>
<property name="devconf.url" value="http://stcdev.sky-mobi.com:8080/devconf" />
<property name="lib.buildfile" value="build-web.xml" />
<import file="build-web.xml" as="impl"/>
<!--import as="impl">
<url url="${devconf.url}/${lib.buildfile}"/>
</import-->
</project>
2012-6-20 杭州斯凯网络科技有限公司 37
38. Ant Task
任务 定义 依赖(depends)
resolve 解析依赖
report 生成依赖报告 resolve
init 初始化目彔 clean-all
prepare-dep hudson构建的变量设置 …
compile 执行编译Java文件 resolve、report、prepare-dep、init
one-war 打war包 compile
make-dist 把项目打成zip one-war
clean-all 清理target目彔
clean-deploy 清理classes目彔
2012-6-20 杭州斯凯网络科技有限公司 38
39. build-web.xml
resolve和report target与mis端声明类似。
其中比较重要,也需要注意的就是打war包,其中classes目彔不使用
WEB-INF自动生成的,而是使用通过compile出来classes。
<target name="one-war" depends="compile">
<war warfile="${dist.war}/${module.name}.war" webxml="${module.webxml}"
manifest="${web.content}/META-INF/MANIFEST.MF">
<fileset dir="${web.content}">
<include name="**/*.*"/>
<exclude name="**/web.xml"/>
<exclude name="**/classes/**"/>
</fileset>
<classes dir="${module.classes}"/>
<lib dir="${compile.lib}/runtime">
<include name="**/*.jar"/>
</lib>
2012-6-20 杭州斯凯网络科技有限公司 39
40. build-web.xml
<manifest>
<attribute name="Specification-Title" value="${module.name}"/>
<attribute name="Specification-Version" value="${module.version}"/>
<attribute name="Implementation-Title" value="${module.name}"/>
<attribute name="Implementation-Version“ value="${module.version}-
${dist.build.number}-${dist.build.id}-[${dist.revision}]"/>
<attribute name="Specification-Vendor"
value="SKY NETWORK TECHNOLOGIES CO.,LTD"/>
<attribute name="Implementation-Vendor"
value="SKY NETWORK TECHNOLOGIES CO.,LTD"/>
</manifest>
</war>
</target>
2012-6-20 杭州斯凯网络科技有限公司 40
41. 选择Ivy的N个理由
使用Ivy
系统构建步骤
系统构建规范
Ivy Resources
2012-6-20 杭州斯凯网络科技有限公司 41