基于ivy ant的java构建初探

43
基基 Ivy/Ant 基 Java 基基基基 系系 系 系系 统一统 10/25/2022 基基基基基基基基基基基基 1

Upload: anson-yang

Post on 03-Aug-2015

1.360 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: 基于Ivy ant的java构建初探

基于 Ivy/Ant 的 Java 构建初探

统一系统部 杨剑

04/15/2023 杭州斯凯网络科技有限公司 1

Page 2: 基于Ivy ant的java构建初探

04/15/2023 杭州斯凯网络科技有限公司 2

选择 Ivy 的 N 个理由

使用 Ivy

系统构建步骤

系统构建规范

Ivy Resources

Page 3: 基于Ivy ant的java构建初探

Java 构建的进化过程

04/15/2023 杭州斯凯网络科技有限公司 3

初期

过渡

现在

未来

直接在 lib 中添加 jar 包1. 直接使用 IDE 导出2. 使用 Ant 来构建

定义 userlibraries ,包含 jar 包声明1. 使用 Ant 构建

使用 Ivy 、 Maven 统一管理依赖1. 使用 Ant+Ivy 构建2. 使用 Maven 构建

。。。。。。

Page 4: 基于Ivy ant的java构建初探

Apache Ivy

Apache Ivy™ is a popular dependency manager

focusing on flexibility and simplicity.

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

04/15/2023 杭州斯凯网络科技有限公司 4

Page 5: 基于Ivy ant的java构建初探

功能 能够和 Apache Ant 紧密集成 支持多个不同的依赖存储 依赖报告 Dependency Reporting

支持持续集成 强大的冲突管理功能

reference :http://ant.apache.org/ivy/features.html

04/15/2023 杭州斯凯网络科技有限公司 5

Page 6: 基于Ivy ant的java构建初探

Ant+Ivy VS Maven

Maven Ant+Ivy

概念 项目管理工具 项目构建工具+ 依赖管理工具

标准构建文件 project.xml 、 maven.xml build.xml

标准依赖文件 pom.xml ivy.xml

学习成本 需要重新学习曲线比较大

目前项目中大多使用 Ant

构建,只需要接入 Ivy

04/15/2023 杭州斯凯网络科技有限公司 6

Page 7: 基于Ivy ant的java构建初探

谁在用 Spring Framework

04/15/2023 杭州斯凯网络科技有限公司 7

Page 8: 基于Ivy ant的java构建初探

04/15/2023 杭州斯凯网络科技有限公司 8

选择 Ivy 的 N 个理由

使用 Ivy

系统构建步骤

系统构建规范

Ivy Resources

Page 9: 基于Ivy ant的java构建初探

环境安装 安装 ANT 配置环境变量:

ANT_HOME: : D:\Java\dev\apache-ant

PATH : %ANT_HOME%\bin ,(为了方便在命令行下操作)

下载 Ivy

将下载的 ivy 安装包解压,然后复制 ivy 的 jar 文件到ant 的 lib 目录下 (ANT_HOME/lib) 。

转到 ivy 解压的 src/example/hello-ivy 目录并运行ant ,检验环境是否配置成功。

04/15/2023 杭州斯凯网络科技有限公司 9

Page 10: 基于Ivy ant的java构建初探

IDE 集成 Eclipse

Apache IvyDE

Intellij IDEA IvyIDEA

Ivy Plugin

目前 Eclipse 的支持较好,其他 IDE 的支持正在改善中

04/15/2023 杭州斯凯网络科技有限公司 10

Page 11: 基于Ivy ant的java构建初探

术语术语 描述

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 仓库04/15/2023 杭州斯凯网络科技有限公司 11

Page 12: 基于Ivy ant的java构建初探

04/15/2023 杭州斯凯网络科技有限公司 12

Page 13: 基于Ivy ant的java构建初探

如何工作

04/15/2023 杭州斯凯网络科技有限公司 13

Page 14: 基于Ivy ant的java构建初探

04/15/2023 杭州斯凯网络科技有限公司 14

选择 Ivy 的 N 个理由

使用 Ivy

系统构建步骤

系统构建规范

Ivy Resources

Page 15: 基于Ivy ant的java构建初探

IvyDE 设置

04/15/2023 杭州斯凯网络科技有限公司 15

设置 Ivy SettingsIvy settings path :http://stcdev.sky-mobi.com:8080/devconf/ivysettings.xml

Page 16: 基于Ivy ant的java构建初探

build.xml

04/15/2023 杭州斯凯网络科技有限公司 16

<?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

Page 17: 基于Ivy ant的java构建初探

ivy.xml

04/15/2023 杭州斯凯网络科技有限公司 17

<?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>

Page 18: 基于Ivy ant的java构建初探

ivy.xml

04/15/2023 杭州斯凯网络科技有限公司 18

<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>

Page 19: 基于Ivy ant的java构建初探

ivy.xml

04/15/2023 杭州斯凯网络科技有限公司 19

属性 描述 基数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

Page 20: 基于Ivy ant的java构建初探

添加到 classpath

04/15/2023 杭州斯凯网络科技有限公司 20

1. 右键 ivy.xml , Add Ivy Library

2. Classpath 添加 ivy 依赖,选择项目 -> 右键属性 ->Java Build Path->Libraries->Add Library...->IvyIDE Managed Dependencies->finish->OK

Page 21: 基于Ivy ant的java构建初探

Demo

改造原有的项目 新建项目

04/15/2023 杭州斯凯网络科技有限公司 21

Page 22: 基于Ivy ant的java构建初探

04/15/2023 杭州斯凯网络科技有限公司 22

选择 Ivy 的 N 个理由

使用 Ivy

系统构建步骤

系统构建规范

Ivy Resources

Page 23: 基于Ivy ant的java构建初探

MIS

目录结构

04/15/2023 杭州斯凯网络科技有限公司 23

Page 24: 基于Ivy ant的java构建初探

目录结构

04/15/2023 杭州斯凯网络科技有限公司 24

目录 描述src\main\java 主程序

src\main\resource 主程序的配置文件

src\test\java 测试程序

src\test\resource 测试程序的配置文件

1. 程序目录

目录 描述private 私有单元配置文件

public 公有单元配置文件

2. 脚本目录

目录 描述bsh BeanShell 脚本

hyperic hyperic 配置

sh Shell 脚本

sql Sql 脚本

manifest MANIFEST.MF 文件

3. 功能单元配置目录

Page 25: 基于Ivy ant的java构建初探

Ant Task

04/15/2023 杭州斯凯网络科技有限公司 25

根据 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 、 initcompile-test 执行编译 Java 测试文件 init

clean-all 清理 target 目录

Page 26: 基于Ivy ant的java构建初探

Ant Task

04/15/2023 杭州斯凯网络科技有限公司 26

任务 定义 依赖 (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

Page 27: 基于Ivy ant的java构建初探

build-app.xml

04/15/2023 杭州斯凯网络科技有限公司 27

使用 ivy ,最频繁的方式是在 Ant 构建文件中,如果使用的 Ant为 1.6.0 版本或以上,只需要添加 ivy 的命名空间到项目中 (project标签的属性 ) xmlns:ivy="antlib:org.apache.ivy.ant“

ivy setting

如果不设置 ivysetting ,默认读 http://ant.apache.org/ivy/history/latest-milestone/samples/ivysettings-default.xml

<project xmlns:ivy="antlib:org.apache.ivy.ant" >

<ivy:settings url="http://stcdev.sky-mobi.com:8080/devconf/ivysettings.xml" />

Page 28: 基于Ivy ant的java构建初探

build-app.xml

04/15/2023 杭州斯凯网络科技有限公司 28

<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 任务共有的所有的行为和属性。

Page 29: 基于Ivy ant的java构建初探

retrieve

04/15/2023 杭州斯凯网络科技有限公司 29

属性 描述 必须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.jarruntime stc-bean-1.0.6-jar.jar

Page 30: 基于Ivy ant的java构建初探

post resolve tasks

在 ivy 中有几个任务被认为是后解析任务 (post resolve task) ,并相应地共享公用行为和设置。这些任务是:

retrieve cachefileset cachepath artifactproperty (since 2.0) artifactreport (since 2.0)

所有这些任务都将自动触发 resolve

04/15/2023 杭州斯凯网络科技有限公司 30

Page 31: 基于Ivy ant的java构建初探

resolve

04/15/2023 杭州斯凯网络科技有限公司 31

解析在 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 设置

当 ivy完成解析任务时,它将输出概要 :

<property name="ivy.default.ivy.user.dir" value="D:\ivy" />

Page 32: 基于Ivy ant的java构建初探

resolve

04/15/2023 杭州斯凯网络科技有限公司 32

Tag tag 模式modules  

number 配置下被解析的依赖模块的总数目,包括间接的依赖search 需要访问仓库的依赖模块的数目dwnlded 从仓库下载的依赖模块的数目evicted 冲突管理器筛选出依赖模块的数目

artifacts

number 配置下被解析的制品的总数目dwnlded 从仓库实际下载的制品数目

Page 33: 基于Ivy ant的java构建初探

publish

04/15/2023 杭州斯凯网络科技有限公司 33

发行当前模块的制品和已解析的描述符 ( 模块声明的 ivy 文件 )目的是发行当前模块描述符和它声明的发行制品到仓库中,提供给其他项目使用。

<ivy:publish resolver="share-release" artifactspattern="${release.dir}/[artifact]-[revision]-[type].[ext]" srcivypattern="${module.home}/ivy.xml" pubrevision="${module.version}" update="true" overwrite="true" status="release" />

Page 34: 基于Ivy ant的java构建初探

publish

04/15/2023 杭州斯凯网络科技有限公司 34

属性 描述 必须resolver 用来发行制品的解析器名称 是

artifactspattern 用于查找发行制品的正则表达式 No ,默认${ivy.publish.src.artifacts.pattern}

srcivypattern用于查找发行制品 ivy 文件的正则表达式

No ,默认与 artifactspattern

相同

pubrevision 用于发行的修订颁布 No , 默 认 为 ${ivy.deliver.revision}

updatetrue 时在发行前更新 ivy 文件的metadata , false 相反

No ,默认为 false

overwritetrue 时覆盖仓库中修订版本一样的文件, false 相反

No ,默认为 false

status 发行的 status No ,默认 ${ivy.status}publish-snapshot 与 publish-release ,区别在于用的 resolver , resolver 的声明在 ivysettings.xml 中可以找到。

Page 35: 基于Ivy ant的java构建初探

WEB

目录结构

04/15/2023 杭州斯凯网络科技有限公司 35

Page 36: 基于Ivy ant的java构建初探

目录结构 目录结构

04/15/2023 杭州斯凯网络科技有限公司 36

术语 描述src 程序目录resources 程序配置文件WebContent(WebRoot) web 目录

Page 37: 基于Ivy ant的java构建初探

build.xml

04/15/2023 杭州斯凯网络科技有限公司 37

<?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>

Page 38: 基于Ivy ant的java构建初探

Ant Task

04/15/2023 杭州斯凯网络科技有限公司 38

任务 定义 依赖 (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 目录  

Page 39: 基于Ivy ant的java构建初探

build-web.xml

04/15/2023 杭州斯凯网络科技有限公司 39

<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>

resolve 和 report target 与 mis端声明类似。其中比较重要,也需要注意的就是打war 包,其中 classes 目录不使用 WEB-INF自动生成的,而是使用通过 compile 出来classes 。

Page 40: 基于Ivy ant的java构建初探

build-web.xml

04/15/2023 杭州斯凯网络科技有限公司 40

<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>

Page 41: 基于Ivy ant的java构建初探

04/15/2023 杭州斯凯网络科技有限公司 41

选择 Ivy 的 N 个理由

使用 Ivy

系统构建步骤

系统构建规范

Ivy Resources

Page 42: 基于Ivy ant的java构建初探

Ivy Resources

Java开发库管理平台 ( 公司 )http://stcdev.sky-mobi.com:8080/nexus/

Mvn Repositories Mvnrepository

IBiblio maven repository

JBoss Maven Repository

Find Jarhttp://www.findjar.com/

Ivy 专栏http://www.iteye.com/wiki/ivy

Apache Ivy

04/15/2023 杭州斯凯网络科技有限公司 42

Page 43: 基于Ivy ant的java构建初探

提问与讨论

04/15/2023 杭州斯凯网络科技有限公司 43