如何使用 ANT 任务从 SVN 结帐?

Posted

技术标签:

【中文标题】如何使用 ANT 任务从 SVN 结帐?【英文标题】:How to checkout from SVN with an ANT task? 【发布时间】:2010-03-08 11:27:18 【问题描述】:

我对任何方式感兴趣,我可以创建一个 Ant 任务来从 SubVersion 签出文件。我“只是”想从命令行进行结帐。我已经使用 Eclipse 和 Ant 和 SubVersion 有一段时间了,但是我的 Ant 和 SubVersion 知识有些欠缺,因为我依赖 Eclipse 将它们连接在一起。

我一直将 SvnAnt 视为一种解决方案,它是来自 Tigris http://subclipse.tigris.org/svnant/svn.html 的 Subclipse 的一部分。它可能工作正常,但我得到的只是 NoClassDefFoundErrors。对于更有经验的人来说,这可能看起来像是一个简单的 Ant 配置问题,但我不知道。我将 svnant.jar 和 svnclientadapter.jar 复制到了我的 Ant lib 目录中。然后我尝试运行以下命令:

<?xml version="1.0"?>

<project name="blah"> 

 <property environment="env"/>

 <path id="svnant.classpath">
  <pathelement location="$env.ANT_HOME/lib"/>
  <fileset dir="$env.ANT_HOME/lib/">
   <include name="svnant.jar"/>
  </fileset>
 </path>

 <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" /> 

 <target name="checkout">
  <svn username="abc" password="123">
   <checkout url="svn://blah/blah/trunk" destPath="workingcopy"/>
  </svn>
 </target>

</project>

我得到以下回复:

build.xml:17: java.lang.NoClassDefFoundError: org/tigris/subversion/javahl/SVNClientInterface

我在 Windows XP 32 位上运行 SVN 1.7 和 SvnAnt 1.3。

感谢您的指点!

【问题讨论】:

***.com/questions/16305315/… 【参考方案1】:

如果你没有让 SvnAnt 工作,你总是可以使用 exec:

<exec executable="/usr/local/bin/svn">
    <arg value="co" />
    <arg value="svn://repository/url" />
    <arg value="/destination/directory" />
</exec>

【讨论】:

完美!谢谢!如果你能做到这一点,不确定 svnAnt 的意义何在? 理论上你要避免在 ant 任务中使用 ,因为它的跨平台兼容性较差。但这并不是在所有情况下都很重要。 对我来说这是最好的解决方案。非常简单(只需安装一个 svn 客户端(在我的情况下为 Sliksvn),将 PATH 指向 sliksvn/bin 即可。svnant 和 javahl 是一团糟……【参考方案2】:

从该错误看来,您的类路径中可能还需要 JavaHL jar(JavaHL 是 Subversion API 的 Java 语言绑定)。你一个

此网址可能会有所帮助: http://subclipse.tigris.org/wiki/JavaHL

否则,您可以使用使用 Ant 来运行本机命令(但这当然会使其依赖于操作系统)。

【讨论】:

【参考方案3】:

让我们看看这是否对你有帮助,我将 svnjavahl.jar、svnClientAdapter.jar 和 svnant.jar 复制到了我的 $ANT_HOME/lib 文件夹中。

然后在xml文件中:

    <path id="svnant.classpath">
    <fileset dir="$ABSOLUTE-PATH-TO-ANT-HOME/lib">
        <include name="**/*.jar"/>
    </fileset>
</path>

<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" /> 

然后,为了结帐..

    <svn dateFormatter="yyyy-MM-dd HH:mm">
    <checkout url="$MY-REPO-PATH" 
              destpath="$checkout.dir/MODULE-NAME" 
                      ....
</svn>

我认为您收到错误是因为您没有将 svnjavahl.jar 文件复制到 lib 文件夹中。这样做,它应该可以工作。

刚刚注意到一些东西,你只包括一个罐子,而不是像我一样的 **/*.jar,因此它找不到你的 svnjavahl.jar.

【讨论】:

【参考方案4】:

如果您试图让 Ant 使用命令行客户端,您可能必须执行以下操作:

<svn username="abc" password="123" javahl="false" svnkit="false"> 

【讨论】:

如果我没有设置 javahl 或 svnkit 属性,那么我会得到 NoClassDefFoundError。如果我将一个或两个设置为 true 或 false,那么我会得到“找不到 javahl、svnkit 和命令行 svn 客户端”。我已经尝试了所有组合,在类路径上有和没有 svnjavahl.jar。 如果您在 Ant 文件中执行以下操作,回显的 PATH 是否包含 SVN 二进制目录? 您需要 a) 使用 JavaHL 进行颠覆的本机 Java 绑定或 b) 在您的路径中可用的命令行 svn 客户端。此答案中的建议适用于 b)。【参考方案5】:

    ANT_HOME/lib(以及$user.home/.ant/lib 和其他一些地方)中的所有.jar 文件都是自动可用的,因此您的&lt;typedef&gt; 根本不需要类路径。

    svnant 发行版尚未更新 1.7 版。您仍然可以使用 svnant.jar,但您需要从 svnant.1.3 替换这些 jar

    svnClientAdapter.jar
    svnjavahl.jar
    

    带有更新版本。我从subclipse 1.8 发行版中提取了这些,甚至不必重命名它们:

    org.tigris.subversion.clientadapter.javahl_1.7.2.jar
    org.tigris.subversion.clientadapter_1.8.0.jar
    

【讨论】:

这确实帮助了我。如果您在 2012 年遇到此错误,那么这意味着您可能正在使用 svnant 发行版尚不支持的 subversion 1.7。所以只需从上面添加两个库,它应该可以工作。 2014 仍然不支持来自 SVNAnt 的高于 1.6 的任何内容。我猜他们自己也在使用 CLI。【参考方案6】:

我的设置几乎相同,但问题相同。

我通过删除 2 个 svn*.jar 解决了这个问题

/usr/share/ant/lib

早些时候。 Ant 被多个罐子弄糊涂了。

【讨论】:

【参考方案7】:

我发现此页面对实现这一目标非常有帮助。对于最新版本,我发现设置svn设置的批准方式如下:

&lt;svnSetting svnkit="true" javahl="false" id="svn.settings" /&gt;

这意味着SVN命令本身应该是:

&lt;svn refid="svn.settings"&gt;//Other commands&lt;/svn&gt;

我实际上想要 svnkit 模式。 上面提到的库都可以,但是我还需要添加以下内容:

org.tmatesoft.sqljet_1.1.7.r1256_v20130327_2103.jar org.tmatesoft.svnkit_1.7.9.r9659_v20130411_2103.jar

org.tigris.subversion.clientadapter.svnkit_1.7.9.2.jar

这些都可以在提到的 subclipse 下载中找到。 tmatesoft 还需要:

antlr-3.5.2-complete.jar

可从此处获得: Antlr

【讨论】:

以上是关于如何使用 ANT 任务从 SVN 结帐?的主要内容,如果未能解决你的问题,请参考以下文章

如何显示学分

如何使用ant在svn中提交单个文件

如何从 Ant 'exec' 任务中导出环境变量?

如何从 ant antfile 任务中获取属性

如何在ANT构建中的多个目标“依赖”属性中使用一个目标?

SVN 从存储库中删除更改,但将它们保留在我的结帐中?