- SVN (Subversion):版本控制命令,用于管理代码历史。
- Ant:构建自动化工具,用于编译、打包、测试项目。
- 如何结合使用:在 Ant 脚本中调用 SVN 命令,实现自动化构建。
第一部分:SVN (Subversion) 常用命令
SVN 是一个集中式版本控制系统,所有代码都存储在一个中央服务器(仓库)上,开发者先从服务器检出代码,在自己的本地工作,然后提交回服务器。

核心工作流命令
-
svn checkout(或svn co)- 作用:从 SVN 仓库下载一个项目到本地,创建一个工作副本。
- 语法:
svn checkout [仓库URL] [本地目录路径] - 示例:
# 从仓库检出 my-project 项目到当前目录下的 my-project 文件夹 svn checkout svn://svn.example.com/project/trunk/my-project
-
svn update(或svn up)- 作用:更新本地工作副本,使其与仓库中的最新版本保持一致。
- 语法:
svn update [本地目录路径] - 示例:
# 更新当前目录 svn update
-
svn commit(或svn ci)- 作用:将本地修改的文件提交到 SVN 仓库,并附上提交日志。
- 语法:
svn commit -m "提交日志" [文件路径...] - 示例:
# 提交当前所有修改,并添加日志信息 svn commit -m "修复了登录页面的一个 bug"
日常操作命令
-
svn add
(图片来源网络,侵删)- 作用:将一个新文件或新目录添加到版本控制中(这只是在本地标记,仍需
commit才会上传)。 - 语法:
svn add [文件/目录路径...] - 示例:
# 添加一个新文件 svn add new_feature.java
- 作用:将一个新文件或新目录添加到版本控制中(这只是在本地标记,仍需
-
svn delete(或svn del)- 作用:从版本控制中删除一个文件或目录(同样需要
commit)。 - 语法:
svn delete [文件/目录路径...] - 示例:
# 删除一个过时的文件 svn delete old_code.java
- 作用:从版本控制中删除一个文件或目录(同样需要
-
svn status(或svn st)- 作用:查看本地工作副本的状态,显示哪些文件被修改、新增或删除。
- 常用选项:
-u: 显示与仓库版本的状态对比。-q: 静默模式,只显示修改的文件。
- 示例:
# 查看当前所有文件的状态 svn status
-
svn diff- 作用:显示本地文件与仓库最新版本之间的差异。
- 语法:
svn diff [文件路径...] - 示例:
# 查看 config.xml 文件的修改 svn diff config.xml
-
svn log
(图片来源网络,侵删)- 作用:查看项目的提交历史记录。
- 常用选项:
-v: 显示每次提交修改的详细信息。-l 5: 只显示最新的 5 条记录。
- 示例:
# 查看最近的 5 条提交记录 svn log -l 5
分支与标签管理
-
svn copy-
作用:创建分支或标签,这是 SVN 中创建分支和标签的标准方式。
-
语法:
- 创建分支:
svn copy [源URL] [分支URL] -m "创建分支的日志" - 创建标签:
svn copy [源URL] [标签URL] -m "创建标签的日志"
- 创建分支:
-
示例:
# 从主干创建一个名为 feature-x 的新分支 svn copy svn://svn.example.com/project/trunk svn://svn.example.com/project/branches/feature-x -m "创建 feature-x 分支" # 从主干创建一个名为 v1.0 的标签 svn copy svn://svn.example.com/project/trunk svn://svn.example.com/project/tags/v1.0 -m "发布 v1.0 版本"
-
第二部分:Ant 常用命令
Ant 是一个基于 Java 的构建工具,它使用一个 XML 文件(通常是 build.xml)来定义构建过程,构建过程由一系列的目标组成,每个目标又由一系列的任务组成。
核心命令
-
ant- 作用:执行
build.xml文件中定义的默认目标(即<project>标签中的default属性指定的目标)。 - 示例:
# 在项目根目录下执行,运行默认的 build 目标 ant
- 作用:执行
-
ant [目标名称]-
作用:执行指定的目标。
-
示例:
# 执行名为 compile 的目标(编译代码) ant compile # 执行名为 package 的目标(打包) ant package # 执行名为 clean 的目标(清理编译文件) ant clean
-
常用内置任务
在 build.xml 文件中,你会看到各种各样的任务标签:
<javac>: 编译 Java 源代码。- 示例:
<javac srcdir="src" destdir="build/classes" />
- 示例:
<java>: 运行一个 Java 类。- 示例:
<java classname="com.example.Main" classpath="build/classes" />
- 示例:
<jar>: 将编译后的.class文件和资源打包成一个.jar文件。- 示例:
<jar destfile="dist/myapp.jar" basedir="build/classes" />
- 示例:
<mkdir>: 创建目录。- 示例:
<mkdir dir="build/classes" />
- 示例:
<delete>: 删除文件或目录。- 示例:
<delete dir="build" />
- 示例:
<copy>: 复制文件或目录。- 示例:
<fileset dir="src" />
- 示例:
<exec>: 执行一个外部命令(这是调用 SVN 命令的关键)。- 示例:
<exec executable="svn" dir="${project.dir}">...</exec>
- 示例:
第三部分:Ant 与 SVN 的结合使用
在实际的持续集成或自动化部署场景中,我们经常需要在构建脚本中执行 SVN 操作,例如在构建前自动从仓库拉取最新代码。
示例:一个典型的 build.xml 文件
下面是一个 build.xml 的例子,它展示了如何结合使用 Ant 和 SVN。
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyWebApp" default="build" basedir=".">
<!-- 定义属性,方便维护 -->
<property name="svn.url" value="svn://svn.example.com/project/trunk/my-webapp" />
<property name="local.dir" value="checkout" />
<property name="src.dir" value="${local.dir}/src" />
<property name="build.dir" value="build" />
<property name="dist.dir" value="dist" />
<!-- 目标 1: 从 SVN 检出/更新代码 -->
<target name="checkout">
<echo message="正在从 SVN 检出代码: ${svn.url}"/>
<!-- 检查本地目录是否存在,如果存在则 update,否则 checkout -->
<available file="${local.dir}" property="dir.exists"/>
<antcall target="svn-update"/>
<antcall target="svn-checkout"/>
<echo message="代码已准备就绪。"/>
</target>
<target name="svn-update" if="dir.exists">
<echo message="目录已存在,执行 update..."/>
<exec executable="svn">
<arg value="update"/>
<arg value="${local.dir}"/>
</exec>
</target>
<target name="svn-checkout" unless="dir.exists">
<echo message="目录不存在,执行 checkout..."/>
<exec executable="svn">
<arg value="checkout"/>
<arg value="${svn.url}"/>
<arg value="${local.dir}"/>
</exec>
</target>
<!-- 目标 2: 清理旧的编译文件 -->
<target name="clean" depends="checkout">
<echo message="正在清理旧的编译文件..."/>
<delete dir="${build.dir}" />
<delete dir="${dist.dir}" />
<mkdir dir="${build.dir}" />
<mkdir dir="${dist.dir}" />
</target>
<!-- 目标 3: 编译代码 -->
<target name="compile" depends="clean">
<echo message="正在编译 Java 源代码..."/>
<javac srcdir="${src.dir}" destdir="${build.dir}/classes" includeantruntime="false" />
<copy todir="${build.dir}/classes">
<fileset dir="${src.dir}">
<include name="**/*.properties"/>
<include name="**/*.xml"/>
<include name="**/*.html"/>
</fileset>
</copy>
</target>
<!-- 目标 4: 打包成 WAR 文件 -->
<target name="package" depends="compile">
<echo message="正在打包成 WAR 文件..."/>
<war destfile="${dist.dir}/my-webapp.war" webxml="${src.dir}/WEB-INF/web.xml">
<fileset dir="${build.dir}/classes" />
<!-- 可以添加其他资源 -->
</war>
</target>
<!-- 目标 5: 完整的构建流程 -->
<target name="build" depends="package">
<echo message="构建完成!"/>
</target>
</project>
如何使用这个 build.xml?
-
首次构建(检出并编译):
# 执行 build 目标,它会依次调用 package, compile, clean, checkout # checkout 会触发 svn-checkout ant build
-
后续构建(更新并编译):
# 再次执行,checkout 会触发 svn-update ant build
-
只编译:
# 假设代码已经是最新的,直接跳过 checkout ant compile
更现代的替代方案
虽然 Ant + SVN 是经典组合,但现在已经被更现代的工具取代:
- 版本控制:Git 已经完全取代了 SVN,成为业界标准,Git 的分布式特性、分支速度快、合并工具强大等优点使其更具优势。
- 构建工具:
- Maven:通过
pom.xml定义项目结构和依赖,生命周期管理非常强大,约定优于配置。 - Gradle:基于 Groovy 或 Kotlin DSL,比 Maven 更灵活,构建脚本更简洁,是目前非常流行的选择。
- 这些现代工具通常都内置了与 Git/SVN 集成的插件,使用起来比 Ant 的
<exec>任务更优雅、更可靠。
- Maven:通过
ant 和 svn 是了解软件工程历史和自动化思想的优秀工具,虽然现在它们可能不再是首选,但理解它们的工作原理对于学习任何构建和版本控制系统都非常有帮助。
