2011-02-24 23 views
8

Estoy ejecutando lote de scp y sshexec y otros comandos remotos de un script de compilación ant. Estos comandos no funcionan si jsch.jar no está en el directorio ant lib. Para hacerlo funcionar, copié el JAR en el directorio ant lib, pero esta no es una buena solución, ya que cualquier otra persona que quiera ejecutar el script debería hacer lo mismo. Para ejecutar el objetivo ant de Teamcity, tendremos que establecer explícitamente la ruta del archivo lib.¿Cómo puedo especificar la ruta de un JAR en un archivo de compilación de ant?

¿Hay alguna manera de especificar la ruta del JAR en el propio XML de construcción Ant?

+0

¿Has probado tu muestra del código de la hormiga? No veo una razón por la que no debería funcionar. Lo uso de la misma manera para otras tareas. – Robert

+0

No digo que no funcione, funciona, pero tengo que agregar jsch.jar en el directorio ant lib, que quiero evitar. Disculpas, si mi pregunta no dice eso correctamente. Tenemos una tarea como esta { \t } Para que esto funcione, tengo que agregar jsch.jar en lib manualmente. ¿Puedo evitar eso poniendo algo en el archivo de compilación – Ravi

+0

? El fragmento que ha eliminado también funciona si el jsch.jar no está en el directorio lib. Luego debe asegurarse de especificar la ruta correcta relativa o absoluta a la misma. – Robert

Respuesta

4

Gracias a todos por sus respuestas. Me las arreglé para que funcione con la tarea de cargador de clases. Esto es lo que hice.

<project basedir="." > 
    <property environment="env"/> 

    <taskdef resource="net/jtools/classloadertask/antlib.xml"> 
    <classpath> 
     <fileset dir="${basedir}/lib" includes="ant-classloader*.jar"/> 
    </classpath> 
    </taskdef> 

    <!--Add JSCH jar to the classpath--> 
    <classloader loader="system"> 
    <classpath> 
     <fileset dir="${basedir}/lib" includes="jsch*.jar"/> 
     </classpath> 
    </classloader> 

    <target name="Test"> 
     <scp todir="user1:[email protected]:/tmp" trust="true" > 
     <fileset dir="dir1"> 
      <include name="test.txt" /> 
     </fileset> 
     </scp> 
    </target> 
</project> 

Como se puede ver aquí, yo no tenía que dar a cualquier objetivo depende de mi objetivo "de prueba", simplemente funciona. Utiliza classloader, que agrega jsch.jar al cargador de clases del sistema.

+0

No creo que el cargador de clases sea necesario. Una declaración de ruta en la parte superior de su archivo habría funcionado bien, combinada con un atributo classpathref en taskdef y task. –

+0

taskdef tendría que declararse de nuevo, para lo cual tendría que eliminar el directorio ant-jsch.jar del directorio lib y agregar nw taskdef para scp y sshexec. – Ravi

+0

Esta solución funcionó muy bien. El archivo jar de la clase y la información se pueden encontrar en http://enitsys.sourceforge.net/ant-classloadertask/ – zombat

2

Una posible solución alternativa sería utilizar la opción de línea de comando -lib para indicar dónde buscar frascos adicionales. Tal vez podría crear un script de envoltura que llame al ant con esta opción configurada.

Otra forma sería la de mover el archivo ant-jsch.jar (este es el frasco que viene con la hormiga que define las tareas, no el archivo jsch.jar es necesario descargar por separado) fuera de un directorio lib hormiga, y crear un taskdef ssh para su tarea de separar a la incorporada en uno, a continuación, establecer la ruta de clases para esta tarea al jsch.jar y la ant-jsch.jar:

<taskdef name="sshexec" 
    classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"> 
    <classpath> 
    <pathelement location="jsch-0.1.44.jar"/> 
    <pathelement location="ant-jsch.jar" /> 
    </classpath> 
</taskdef> 

no estoy seguro de que esto le ayudará, sin embargo, ya que también implica hacer cambios a el directorio lib.

Por lo que sé, actualmente no es posible especificar los frascos adicionales necesarios para las tareas integradas en el archivo de compilación en general. Hay algunos casos especiales, como junit, por ejemplo.

+0

Si hay problemas si la tarea requiere más de un JAR, ¿por qué no simplemente fusionar todos los JAR en un JAR? – Robert

+1

No quiero hacer cambios en el directorio ant lib ya que no tengo ningún control sobre él. Esta opción no funcionaría en ese escenario – Ravi

1

Para asegurar que su compilación sea más multiplataforma, le sugiero usar la administración de dependencias. El ivy plug-in puede instalar automáticamente la versión del complemento de su compilación en tiempo de compilación.

Este enfoque significa que el último frasco que necesitará para instalar en su lib ANT es hiedra 2.2.0.jar :-)

Primera declarar dependencias de su proyecto en el archivo ivy.xml

<ivy-module version="2.0"> 
    <info organisation="com.myspotontheweb" module="demo"/> 
    <configurations> 
     <conf name="anttask" description="Jars implementing ANT tasks"/> 
    </configurations> 
    <dependencies> 
     <dependency org="com.jcraft" name="jsch" rev="0.1.42" conf="anttask->default"/> 
    </dependencies> 
</ivy-module> 

Dentro de su build.xml plazo de hiedra y utilizarla para rellenar una ruta de clases personalizado basado en la configuración de la hiedra:

<target name='init' description='Resolve project dependencies and set classpaths'> 
    <ivy:resolve/> 
    <ivy:cachepath pathid="anttask.path" conf="anttask"/> 
</target> 

Finalmente, en otra parte de su compilación, declare sus tareas ANT utilizando la ruta de clase que ahora se rellena automáticamente con ivy.

<target name='dosomething' depends="init"> 
    <taskdef name="sshexec" 
      classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec" 
      classpathref="anttask.path"/> 
    .. 
    .. 
</target> 

Este enfoque funciona para todos los plug-ins ANT, la mayoría de los cuales están disponibles en el repositorio central de Maven. El segundo beneficio es que es fácil actualizar las versiones de los complementos en todas las construcciones.

+0

Esto no soluciona el problema de algunos jars que necesitan estar en el directorio lib de hormig para satisfacer los requisitos de carga de clases. La tarea ant actual se define en ant-jsch.jar que viene con hormiga, no en el jsch.jar descargado por separado. El problema es hacer que jsch.jar sea visible para las clases en ant-jsch.jar. ¿O me estoy perdiendo algo? – matt

+0

Verifica el atributo "classpathref" en la tarea taskdef. Le permite especificar la ruta de clase que se utilizará al declarar su tarea. La oferta de hiedra de asistencia es la capacidad de descargar y poblar esa ruta de clase en tiempo de compilación. Esto es lo que hace la herramienta de construcción Maven, todos sus complementos se descargan. –

+0

Me gusta bastante su enfoque, pero de nuevo aquí cada tarea tendrá que llamar a la tarea ** init ** primero 'depends =" init "'. Estoy buscando la opción que se parece más al enfoque "cambiar una vez y trabajar para todos". – Ravi

Cuestiones relacionadas