El cliente svn 'svnkit' no está disponible

He estado utilizando svnant 1.3.0 para crear tags desde sucursales en mi repository SVN. Ahora me he actualizado de SVN 1.6 a 1.7 y no hay ningún binary SVNANT lanzado que lo admita. Pero descargué la fuente svnant 1.4 de tigris.org y construí un svnant.jar.

Sé que svnant tiene algunas dependencies y tengo lo siguiente: svnkit 1.7.5 (del repository svnant), svnjavahl (del repository svnant), svnClientAdapter (del repository svnant), svnkit-cli (del repository svnant), trilead-ssh 1.0 (del repository de maven) y ganymed-ssh.jar build 210 (del repository de maven).

Utilizo IVY para la administración de dependencies y he agregado todos los files jar anteriores (excepto los dos del repository maven) a mi installation de Artifactory. En mi file de dependencia de IVY recupero los flasks así:

<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" /> 

Todos los flasks se recuperan correctamente. Intento hacer una copy de branch2tag como tal (El objective retrieveIVY recupera los files jar descritos anteriormente):

 <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> 

Esto funcionó con svnant 1.3.0 y SVN 1.6 (aparte de la label svnSetting). Pero usando las nuevas versiones de jar me sale el siguiente error:

 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 

¿Alguien tiene una idea que podría resolver este problema?

Aconsejaría usar las classs svnkit java directamente en lugar de luchar con la tarea svnant . Este enfoque, combinado con un macrodef, dará como resultado una solución similar pero más confiable.

 <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> 

Nota:

  • Este ejemplo utiliza la tarea ivy cachepath para download las dependencies en una reference de ruta de class local llamada "build.path".