我试图使用svnant的propget任务查询SVN属性值,但遇到了问题。
我已经编写了一个简单的Ant目标来更新构建文件的文件夹,然后查询一个属性:
<project name="svntest" default="test">
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" />
<svnSetting javahl="false" svnkit="true" username="xxx" password="yyy" id="svn.settings" />
<target name="test">
<svn refid="svn.settings">
<update dir="." />
<propget path="file.xml" name="svn:keywords" property="prop.value" />
</svn>
<echo message="${prop.value}" />
</target>
</project>
我的SVN回购是在1.7.5,我有svnkit 1.7,它应该是兼容的。
如果我注释掉propget和echo行,它会很好地更新文件夹。但是,当我尝试查询特定文件的svn:keywords属性时,我会得到以下错误:
C:\somepath\test.xml:11:java.lang.NoSuchMethodError:org.tigris.subversion.javahl.PropertyData
我已经将file.xml的svn:keywords属性设置为"value",所以它确实存在,并提交了它。
如果我更改propget-name参数以查找不存在的SVN属性(例如"testprop"),它不会失败,只是返回"${prop.value}",我认为这是因为没有设置prop.value属性。如果我真的把自定义的"testprop"SVN属性添加到file.xml中,我会再次得到上面的错误——所以它似乎只有在找到一个属性并试图获得它的值时才会发生。
我以前在尝试使用javahl时遇到过问题,因此将其设置为false并使用svnkit。然而,由于更新任务有效,我不会认为javahl/svnkit绑定是问题所在。
感谢任何帮助,谢谢。
SVNKit的JavaHL绑定位于名为svnkit-javahl16-*VERSION*.jar
的文件中。该文件可以在从SVNKit网站下载的standalone.zip
的lib
目录下找到。
这个Jar文件需要位于Ant类路径上。
编辑-2014年1月10日跟进:
"失踪"的方法肯定在svnkit-javahl16-1.7.11jar:
> javap -s -classpath svnkit-javahl16-1.7.11.jar org.tigris.subversion.javahl.PropertyData
...
org.tigris.subversion.javahl.PropertyData(org.tigris.subversion.javahl.SVNClientInterface, java.lang.String, java.lang.String, java.lang.String, byte[]);
Signature: (Lorg/tigris/subversion/javahl/SVNClientInterface;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B)V
...
不知怎么的,这个构造函数在Ant的类路径中找不到。
在命令提示符中运行以下命令:
> set ANT_OPTS=-verbose:class
> ant <= your Ant command line here
将会产生雪崩式的输出。在这将埋一条线如下:
[Loaded org.tigris.subversion.javahl.PropertyData from file:/...]
让我们知道您系统中的file:/...
是什么。如果没有完全匹配,那么查看是否有对名称中带有"javahl"的已加载类的引用。