1. 目标
用maven打包jar,然后把jar拷贝到本地的产品目录,再用svn将jar提交到公司的SVN服务器。
2. 环境
eclipse 2021-12R
maven 3.8.5
ant 1.10.12
svn 1.14.0
操作系统 mac OS
3. 实现过程
关于如何在maven中调用ant脚本,已经在文章《2. maven调用ant脚本》中描述了。
下面描述如何在ant脚本中用svn提交。
3.1 svnant插件相关jar包
首先需要用到ant的svnant插件。在笔者在寻找打包好的svnant-1.3.1.jar时,因官网不可访问,maven上版本太旧(1.3)配置项和网上的配置资料有出入,其它地方各种会员限制或广告套路,选择自己从github上下载源码自己编译。GitHub上的svnant源码地址。它是一般的java工程,依赖的jar包在源码工程里都有,所有打包是一件“easy-->asy-->sy-->y”的事情。
使用的jar包主要有:
svnkit-*.jar需要升级一下,否则连接svn将报版本太低。另外的还需要引入一个lz4-java-1.8.0.jar,如果上图所示。将这些jar添加到ant的classpath中,此时ant脚本就能正常使用svn了。
3.2 ant脚本配置
ant脚本的关键配置在下面的配置文件中注明:
<?xml version="1.0" encoding="UTF-8"?>
<project name="export_jar" basedir="." default="pack">
<!--必须定义这个标签-->
<taskdef resource="net/sf/antcontrib/antlib.xml" />
<taskdef resource="org/tigris/subversion/svnant/svnantlib.xml" />
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml"/>
...省略
<!-- 将svn的用户密码,在工程外面用个properties文件存储一下,不放在工程里面,避免提交源码时被提交上去,也方便多个工程共用 -->
<property file="/Users/XXX/workspace/svn.properties" />
<svnSetting id="svn.setting" username="${svn.username}" password="${svn.password}"/>
...省略
<!-- 打包 -->
<target name="pack" depends="checkEnv">
... 省略
<for list="${groups}" delimiter="," param="group">
<sequential>
<var name="jarPublishDir" value="${productDir}/@{group}/${subDir}" />
<var name="jarPath" value="${jarPublishDir}/${jarFileName}" />
<!-- svn 更新 -->
<if>
<and>
<isset property="svn.@{group}" />
<istrue value="${svn.@{group}}" />
</and>
<then>
<echo>SVN更新:${jarPath}</echo>
<svn refid="svn.setting">
<cleanup dir="${jarPublishDir}" />
<update file="${jarPath}" recurse="false" />
</svn>
</then>
</if>
<echo>将文件拷贝到正式发布位置:${jarPublishDir}</echo>
<copy file="${tempOutJar}" todir="${jarPublishDir}" />
<!-- svn 提交 -->
<if>
<and>
<isset property="svn.@{group}" />
<istrue value="${svn.@{group}}" />
</and>
<then>
<echo>SVN提交jar:${jarPath}</echo>
<svn refid="svn.setting">
<commit file="${jarPath}" recurse="false" message="${svn.username}通过ant脚本提交" />
</svn>
</then>
</if>
</sequential>
</for>
</target>
</project>
3.3 maven配置
maven调用ant脚本时,ant脚本所使用到的扩展jar,需要在maven配置文件中dependency上。如下图:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...省略
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testSourceDirectory>src/test/java</testSourceDirectory>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>pack-eclipse-plugin</id>
<phase>deploy</phase>
<configuration>
<target name="pack_eclipse_plugin">
<echo>开始调用Ant脚本...</echo>
<ant antfile="publish.ant" target="pack" />
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<!-- ant所需使用到的扩展jar包 -->
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.12</version>
</dependency>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>1.0b3</version>
</dependency>
<dependency>
<groupId>XXXX</groupId>
<artifactId>svnant</artifactId>
<version>1.3.1</version>
<type>pom</type>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
将打包好的svnant-1.3.1.jar和源码工程里的svnClientAdapter.jar上传到自己的maven仓库,然后编写一个pom工程,在其中引入svnant相关的依赖项,如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>XXX</groupId>
<artifactId>svnant</artifactId>
<version>1.3.1</version>
<name>SVN ANT Plugin</name>
<description>用于ANT的SVN插件</description>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.tigris</groupId>
<artifactId>svnant</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.tigris</groupId>
<artifactId>svnClientAdapter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.10.5</version>
</dependency>
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit-javahl16</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
<distributionManagement>
<repository>
...省略
</repository>
<snapshotRepository>
...省略
</snapshotRepository>
</distributionManagement>
</project>
网友评论