2013-04-30 117 views
1

我一直在使用svnant 1.3.0從SVN倉庫中的分支創建標籤。現在我已經從SVN 1.6升級到1.7,並且沒有發佈支持它的svnant二進制文件。但是我從tigris.org下載了svnant 1.4源代碼並構建了一個svnant.jar。我知道svnant有一些依賴,我有以下幾點:svnkit 1.7.5(來自svnant存儲庫),svnjavahl(來自svnant存儲庫),svnClientAdapter(來自svnant存儲庫),svnkit-cli(來自svnant存儲庫) ,trilead-ssh 1.0(來自maven倉庫)和ganymed-ssh.jar build 210(來自maven倉庫)。svn客戶端的'svnkit'不可用

我使用IVY進行依賴關係管理,並將所有上述jar(maven存儲庫中的兩個除外)添加到我的Artifactory安裝中。在我的IVY依賴文件中,我檢索如下所示的罐子:

<dependency org="svnant" name="svnant" rev="1.4.0" conf="test->default" /> 
<dependency org="svnkit" name="svnkit" rev="1.7.5" conf="test->default" /> 
<dependency org="svnjavahl" name="svnjavahl" rev="1.4.0" conf="test->default" /> 
<dependency org="svnClientAdapter" name="svnClientAdapter" rev="1.4.0" conf="test->default" /> 
<dependency org="svnkit-cli" name="svnkit-cli" rev="1.7.5"/> 
<dependency org="trilead-ssh2" name="trilead-ssh2" rev="1.0.0" conf="test->default"/> 
<dependency org="ch.ethz.ganymed" name="ganymed-ssh2" rev="build210" conf="test->default" /> 

所有罐子都被正確檢索。我試着像這樣(的retrieveIVY目標檢索上述jar文件)做一個branch2tag副本:

<target name="create-tag" depends="retrieveIVY"> 
    <taskdef classpathref="test.classpath.dep" resource="net/sf/antcontrib/antcontrib.properties" /> 
    <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="test.classpath.dep" /> 
    <echo message="Creating tag ${env.tag_name}" /> 
    <svnSetting username="${user}" password="${password}" client="svnkit" /> 
    <svn> 
     <copy srcUrl="[srcUrl]" destUrl="[destUrl]" message="${env.tag_name}" /> 
    </svn> 
</target> 

這與svnant 1.3.0和SVN 1.6(除了svnSetting標籤)工作。但使用新的jar版本,我得到以下錯誤:

The svn client 'svnkit' is not available ! 
at org.tigris.subversion.svnant.SvnClientType.checkAvailability(SvnClientType.java:122) 
at org.tigris.subversion.svnant.SvnClientType.createClient(SvnClientType.java:93) 
at org.tigris.subversion.svnant.SvnFacade.getClientAdapter(SvnFacade.java:362) 
at org.tigris.subversion.svnant.SvnTask.executeImpl(SvnTask.java:597) 
at org.tigris.subversion.svnant.SvnTask.execute(SvnTask.java:568) 
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
at org.apache.tools.ant.Task.perform(Task.java:348) 
at org.apache.tools.ant.Target.execute(Target.java:392) 
at org.apache.tools.ant.Target.performTasks(Target.java:413) 
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) 
at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424) 
at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138) 
Caused by: org.tigris.subversion.svnclientadapter.SVNClientException: SVNKit client adapter is not available 
at org.tigris.subversion.svnclientadapter.svnkit.SvnKitClientAdapterFactory.setup(SvnKitClientAdapterFactory.java:75) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.tigris.subversion.svnant.SvnClientType.invoke(SvnClientType.java:129) 
at org.tigris.subversion.svnant.SvnClientType.checkAvailability(SvnClientType.java:112) 
... 19 more 

有人有一個想法可以解決這個問題嗎?

回答

4

我會建議直接使用svnkit java類,而不是奮鬥svnant任務。這種方法與macrodef相結合將產生類似但更可靠的解決方案。

<project name="build" default="checkout" xmlns:ivy="antlib:org.apache.ivy.ant"> 

    <!-- 
    ====== 
    Macros 
    ====== 
    --> 
    <macrodef name="svn-checkout"> 
     <attribute name="src"/> 
     <attribute name="dest"/> 
     <sequential> 
      <mkdir dir="@{dest}"/> 
      <java classname="org.tmatesoft.svn.cli.SVN" dir="@{dest}" fork="true" classpathref="build.path"> 
       <arg value="--non-interactive"/> 
       <arg line="--username ${svn.user}"/> 
       <arg line="--password ${svn.pass}"/> 
       <arg value="checkout"/> 
       <arg value="@{src}"/> 
      </java> 
     </sequential> 
    </macrodef> 

    <!-- 
    ======= 
    Targets 
    ======= 
    --> 
    <target name="resolve" description="Resolve 3rd party dependencies"> 
     <ivy:cachepath pathid="build.path"> 
      <dependency org="org.tmatesoft.svnkit" name="svnkit-cli" rev="1.7.8" conf="default"/> 
     </ivy:cachepath> 
    </target> 

    <target name="checkout" depends="resolve" description="Pull code from SCM repository"> 
     <svn-checkout src="http://svn.apache.org/repos/asf/subversion/trunk" dest="build/subversion"/> 
    </target> 

    <target name="clean" description="Cleanup build files"> 
     <delete dir="build"/> 
    </target> 

    <target name="clean-all" depends="clean" description="Cleanup and purge ivy cache"> 
     <ivy:cleancache/> 
    </target> 

</project> 

注:

  • 本例使用常青藤cachepath任務的依賴性下載到名爲「build.path」本地類路徑參考。
+0

感謝您的回答。我有一個後續問題。簽出是否將存儲庫中的相同結果(對於dest)作爲svnant複製操作? – jkc 2013-05-01 07:06:51

+0

非常感謝您的幫助。我改變了你的例子使用複製命令,它的工作原理。 – jkc 2013-05-01 15:42:05