2012-09-11 25 views
14

Actualmente tengo ANT_HOME ubicado en /home/<myuser>/ant/1.8.4/ant-1.8.4.Cómo configurar Ivy para Ant build

Acabo de descargar the Apache Ivy tarball that includes its dependencies. Lo extraje al /home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1.

Copié /home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1/lib/*.jar en ANT_HOME/lib. Si mi comprensión de cómo Ant funciona con plugins/extensiones es correcta, entonces Ant ahora debería poder acceder a todas las tareas de Ivy en tiempo de ejecución.

Mi siguiente pregunta es, ¿cómo puedo definir las tareas de Ivy dentro de mi archivo de compilación Ant? Supongamos que quiero utilizar las tareas ivy-retrieve, ivy-resolve y ivy-publish. ¿Cuáles son todas las configuraciones que necesito hacer (en el XML) para que funcionen estas tareas cuando ejecuto mi compilación Ant desde la línea de comandos (no construiré a través del complemento Ant-Eclipse). ¡Gracias por adelantado!

Respuesta

56

Primero, debe definir un <taskdef> para apuntar a las tareas de Ivy.

<property environment="env"/> 
<property name="ivy.home" value="${env_IVY_HOME}"/> 

<taskdef resource="org/apache/ivy/ant/antlib.xml"> 
    <classpath> 
     <fileset dir="${ivy.home}"> 
      <include name="*.jar"/> 
     </fileset> 
    </classpath> 
</taskdef> 

Eso le dará acceso a las tareas de Ivy. Utilizaría estas tareas como esta:

<cachepath pathid="main.classpath" conf="compile"/> 

El problema es que sus nombres de tareas Ivy pueden chocar con otras tareas Ant. Por ejemplo, hay una tarea Ivy <report>. Para resolver esto, puede crear un espacio de nombre Ivy. Para hacer eso, se pone una referencia en el espacio de nombres en la entidad <project> así:

<project name="my.proj" default="package" basedir="." 
    xmlns:ivy="antlib:org.apache.ivy.ant"/> 

Ahora, cuando se definen las tareas de la hiedra, puede utilizar esa referencia a su antlib:org.apache.ivy.antivy espacio de nombres. Taskdef mismo que antes, pero con un campo uri:

<property environment="env"/> 
<property name="ivy.home" value="${env_IVY_HOME}"/> 

<taskdef resource="org/apache/ivy/ant/antlib.xml" 
    uri="antlib:org.apache.ivy.ant"> 
    <classpath> 
     <fileset dir="${ivy.home}"> 
      <include name="*.jar"/> 
     </fileset> 
    </classpath> 
</taskdef> 

Por cierto, no hay nada especial acerca de que uri. Podría haber hecho esto:

<project name="my.proj" default="package" basename="." 
    xmlns:ivy="pastrami:with.mustard"> 

[...] 
<taskdef resource="org/apache/ivy/ant/antlib.xml" 
    uri="pastrami:with.mustard"> 
    <classpath> 
     <fileset dir="${ivy.home}"> 
      <include name="*.jar"/> 
     </fileset> 
    </classpath> 
</taskdef> 

El punto es que ahora se puede prefijar los nombres de las tareas con ivy:. En lugar de esto:

<cachepath pathid="main.classpath" conf="compile"/> 

Ahora puede hacer esto:

<ivy:cachepath pathid="main.classpath" conf="compile"/> 

y así es como se accede a sus tareas Ivy Ant.

Ahora, usted tiene acceso a sus tareas Ivy hormiga, es necesario definir un archivo ivysettings.xml y utilizar la tarea <ivy:settings/> señalar que hay:

<ivy:settings file="${ivy.home}/ivysettings.xml"/> 

hay un archivo por defecto ivysettings.xml incrustado en la hiedra que apuntará usted al sistema de repositorio de Maven en todo el mundo. Si usted no tiene un repositorio Maven gran empresa, a continuación, puede utilizar el archivo predeterminado ivysettings.xml:

<ivy:settings/> 

Eso es bastante simple.

Una vez que hayas hecho esto, es necesario leer y resolve su archivo ivy.xml que por lo general se encuentra en la raíz de su proyecto en el mismo directorio que el archivo build.xml.

Básicamente, su archivo ivy.xml contiene referencias a los archivos jar de terceros que desea incorporar a su proyecto. Por ejemplo:

<dependencies> 
    <dependency org="log4j" name="log4j" rev="1.2.17" conf="compile->default"/> 
    <dependency org="junit" name="junit" rev="4.10" conf="test->default"/> 
</dependencies> 

Lo que esto quiere decir es que necesito el log4j.jar (revisión 1.2.17) para la compilación (y para la elaboración de las pruebas también) y necesito junit.jar (revision.4.10) para la compilación de mi código de prueba .

El compile->default es un mapeo de la configuración de mi compile a la configuración de Maven default (que dice que yo sólo quiero el tarro y cualquier otro tarros que podría depender.

Donde es lo hace la configuración de mi compile viene? Defino .. en mi ivy.xml Hay diez configuraciones estándar Esto también va en su ivy.xml archivo:

<configurations> 
    <conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/> 
    <conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/> 
    <conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/> 
    <conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/> 
    <conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/> 
    <conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/> 
    <conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/> 
    <conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/> 
    <conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/> 
    <conf name="optional" visibility="public" description="contains all optional dependencies"> 
</configurations> 

se puede usar cualquier nombre de la configuración que desee, pero éstos se asignan a las configuraciones por defecto una Maven d son ampliamente utilizados.

Una vez que haya definido su archivo ivy.xml, puede utilizar <ivy.resolve> para resolver sus dependencias:

<ivy:resolve/> 

Por lo tanto, tenemos lo siguiente:

  1. Cómo usar <taskdef> en su build.xml para incorporar las tareas de Ivy Ant en su compilación.
  2. Cómo usar la tarea Ivy Ant <ivy:settings> para configurar Ivy.
  3. Cómo usar <ivy:resolve/> para leer en su archivo ivy.xml y resolver las dependencias de jar de terceros.

Ahora, probablemente desee utilizar realmente esos archivos jar. Hay tres maneras de hacer esto:

<ivy:cachepath pathid="main.classpath" conf="compile"/> 

El <ivy:cachepath/> tarea creará una ruta de clase (en este caso llamado main.classpath) que señala a los frascos que tiene en su archivo de configuración de ivy.xmlcompile. Esto se usa la mayor parte del tiempo.

Si necesita un conjunto de archivos, puede utilizar esto:

<ivy:cachefileset setid="compile.fileset" conf="compile"/> 

En este caso, se creará un conjunto de archivos con un refid de compile.fileset.

A veces tiene que llevar los tarros a su proyecto. Por ejemplo, si crea un archivo war o ear, quiere encerrar sus jarras.En ese caso, puede utilizar esto:

<property name="lib.dir" value="${target.dir}/lib"/> 
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]" 
    conf="runtime"/> 

Eso se ha podido recuperar sus tarros en el directorio ${lib.dir}, para que pueda incluirlos en las guerras o los oídos.

Disculpe por la respuesta larga, pero hay muchos pasos por recorrer. Recomiendo encarecidamente el libro de Manning Ant in Action que tiene un capítulo completo sobre Ivy.

+3

Esto es, con mucho, la respuesta más completa a cualquier cuestión relacionada con la hiedra le he pedido o han llegado a través de, desearía poder votarlo más. Gracias por tomarse el tiempo para ayudarme aquí, fue perfecto. Una pregunta de seguimiento rápida (si es posible): planeo tener mi propio repositorio alojado, probablemente administrado por Artifactory. Cada vez que he trabajado con Ivy, he visto a mis compañeros de trabajo definir sus atributos 'conf' como' conf = "* -> *" 'o' conf = compilar-> default', pero nadie parece tener una clara Comprensión de lo que hacen, y por qué ... – IAmYourFaja

+0

Usted menciona que es un mapeo entre la configuración Ivy local ('ivy.xml') y el repositorio contra el cual se resuelve, e incluso fue lo suficientemente generoso como para mostrar qué' compilación' config podría verse como (frente a una configuración 'test'). Pero, ¿qué pasa con el lado del repositorio (el lado derecho del operador de "flecha")? ¿A qué se refiere el mapa "' * -> * '"? ¿Qué pasa con "' default' "? Solo curiosidad porque no importa cuántas veces leí los documentos de Ivy, parece que no puedo entenderlo. ¡Gracias, de nuevo, por toda su ayuda! – IAmYourFaja

+0

No hay configuraciones estándar en Ivy. Debes definir tus configuraciones en tu archivo 'ivy.xml'. Los estándares mencionados en mi mapa de correos a Maven _scopes_. Puedo definir una única configuración en mi 'ivy.xml', o puedo agregar algunas que no mencioné anteriormente. Por ejemplo, algunas personas han agregado una configuración 'generated-sources' en' ivy.xml para cosas como axis2 y archivos WSDL. Lo que pasa es que debe asignar su configuración a la configuración de repos. Nunca he intentado '* -> *'. Supongo que mapea todas sus configuraciones en su 'ivy.xml' a todas las configuraciones del repositorio. Tendré que intentarlo. –

12

David dio una respuesta muy buena, pero me gustaría señalar que la tarea no es necesaria. Siempre que el ivy.jar está en la ubicación prevista la declaración de espacio de nombres en la parte superior del archivo ANT es suficiente:

<project ..... xmlns:ivy="antlib:org.apache.ivy.ant"> 

Para más detalle lo recomiendo leer acerca de cómo ANT libs trabajo.

La siguiente respuesta proporciona "la creación de la hiedra" un poco más consejos:

+1

esta es la respuesta correcta y simple, si ivy.jar está en ant_home/lib – oers

Cuestiones relacionadas