2011-12-29 11 views
15

Soy un novato total con Ivy, y han estado tratando a cabo de manera muy sencilla, para ir a buscar bibliotecas de uso común como Guava y Gson que son available en el repositorio central de Maven:¿Cómo decirle a Ivy que coloque frascos descargados en un directorio personalizado?

<ivy-module version="2.0"> 
    <info organisation="com.company" module="foobar"/>  
    <dependencies> 
     <dependency org="com.google.guava" name="guava" rev="10.0.1"/> 
     <dependency org="com.google.code.gson" name="gson" rev="2.0"/> 
    </dependencies>  
</ivy-module> 

En Windows, por predeterminado, Ivy almacena sus archivos en %USERPROFILE%\.ivy2\cache\; en sistemas Unix-y, se descargan bajo $HOME/.ivy2/.

Supongo que esta es una pregunta bastante básica: cómo decirle a Ivy que descargue ambos archivos binarios y fuentes, y que coloque los archivos binarios en un directorio (arbitrario) y archivos fuente en otro directorio?

Por ejemplo, me gustaría que Ivy coloque todos los archivos binarios descargados en [project_home]/WebContent/WEB-INF/lib.

Tenga en cuenta que estoy usando Ivy vía Ant, a lo largo de las siguientes líneas, no un complemento IDE.

<project xmlns:ivy="antlib:org.apache.ivy.ant" name="ivy" default="resolve" > 
    <target name="resolve" description="retrieve dependencies with ivy"> 
     <ivy:retrieve/> 
    </target> 

    <path id="ivy.lib.path"> 
     <fileset dir="tools/buildlibs" includes="*.jar"/> 
    </path> 
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>   
</project> 

Respuesta

7

~/.ivy2 es sólo el ivy cache.

Tienes que establecer un patrón en ivy retrieve. Esto definirá dónde se descargan las dependencias.

<ivy:retrieve pattern="${project_home}/WebContent/WEB-INF/lib/[artifact].[ext]" conf="jars"/> 

Y tal vez una segunda recuperar de las fuentes:

<ivy:retrieve pattern="${project_home}/sources/[artifact].[ext]" conf="sources"/> 

Esto también va a funcionar, y poner las dependencias de las fuentes y los frascos en diferentes directorios:

<ivy:retrieve pattern="${project_home}/[conf]/[artifact].[ext]" conf="sources, jars"/> 

Depende cómo se designan las fuentes/jarras en su repositorio.

Y en una nota al margen: el taskdef tiene que venir antes de usar una tarea.

Y debe definir el resolver de m2compatible:

<ibiblio name="maven2" m2compatible="true"/> 
+0

Gracias! Estoy probando este tipo de configuración, pero ahora aparece el error: "No existe el archivo de informe '~/.ivy2/cache/com.company-foobar-jars.xml'. Parece extraño si necesito crear manualmente dicho archivo en el directorio de la caché ivy ... ¿Todavía falta algo en la configuración de Ivy? – Jonik

+0

@Jonik difícil de decir, ¿ejecutó antes de recuperar? – oers

+0

No; Traté de agregar pero todavía recibo el mismo error. De los mensajes de error, parece que no puedo simplemente agregar 'conf =" jar "' en una llamada sin definir la configuración "jars" en alguna parte: 'configuración solicitada no encontrada en com.company # foobar; funcionamiento @jonik: jarros'. Pero, ¿cómo hacer eso? – Jonik

16

Otra SO answer describe cómo se utilizan las configuraciones para mantener a los grupos de dependencias separadas. Sin embargo, este problema podría requerir que las dependencias se declaren más de una vez para que quepan en diferentes configuraciones de hiedra.

intente lo siguiente:

ivy.xml

<ivy-module version="2.0"> 
    <info organisation="com.company" module="foobar"/>  
    <configurations> 
     <conf name="sources" description="Source jars"/> 
     <conf name="binaries" description="binary jars"/> 
    </configurations> 
    <dependencies> 
     <dependency org="com.google.guava" name="guava" rev="10.0.1" conf="sources->sources"/> 
     <dependency org="com.google.code.gson" name="gson" rev="2.0" conf="sources->sources"/> 

     <dependency org="com.google.guava" name="guava" rev="10.0.1" conf="binaries->default"/> 
     <dependency org="com.google.code.gson" name="gson" rev="2.0" conf="binaries->default"/> 
    </dependencies>  
</ivy-module> 

build.xml

<project xmlns:ivy="antlib:org.apache.ivy.ant" name="hello-ivy" default="resolve"> 

    <target name="resolve" description="retrieve dependencies with ivy"> 
     <ivy:retrieve conf="sources" pattern="lib/[conf]/[artifact](-[classifier]).[ext]"/> 
     <ivy:retrieve conf="binaries" pattern="lib/[conf]/[artifact](-[classifier]).[ext]"/> 
    </target> 

    <target name="clean" description="Remove build directories"> 
     <delete dir="lib"/> 
    </target> 

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

</project> 

Nota: actualizado para añadir objetivo que purga la caché de hiedra.

Build se ejecuta de la siguiente manera, para asegurar artefactos están recién descargado:

$ ant clean-all resolve 

Resultado

$ find . -type f 
./build.xml 
./ivy.xml 
./lib/sources/gson-sources.jar 
./lib/sources/guava-sources.jar 
./lib/binaries/gson.jar 
./lib/binaries/jsr305.jar 
./lib/binaries/guava.jar 

La prueba de que el artefacto de origen contiene archivos de Java:

$ unzip -t ./lib/sources/gson-sources.jar 
Archive: ./lib/sources/gson-sources.jar 
    testing: META-INF/    OK 
    testing: META-INF/MANIFEST.MF  OK 
    testing: com/      OK 
    testing: com/google/    OK 
    testing: com/google/gson/   OK 
    testing: com/google/gson/annotations/ OK 
    testing: com/google/gson/internal/ OK 
    testing: com/google/gson/internal/bind/ OK 
    testing: com/google/gson/reflect/ OK 
    testing: com/google/gson/stream/ OK 
    testing: com/google/gson/annotations/Expose.java OK 
    testing: com/google/gson/annotations/package-info.java OK 
    testing: com/google/gson/annotations/SerializedName.java OK 
    testing: com/google/gson/annotations/Since.java OK 
    testing: com/google/gson/annotations/Until.java OK 
    testing: com/google/gson/AnonymousAndLocalClassExclusionStrategy.java OK 
    testing: com/google/gson/Cache.java OK 
    testing: com/google/gson/CamelCaseSeparatorNamingPolicy.java OK 
    testing: com/google/gson/CompositionFieldNamingPolicy.java OK 
    testing: com/google/gson/DefaultTypeAdapters.java OK 
    testing: com/google/gson/DisjunctionExclusionStrategy.java OK 
    testing: com/google/gson/ExclusionStrategy.java OK 
    testing: com/google/gson/ExposeAnnotationDeserializationExclusionStrategy.java OK 
    testing: com/google/gson/ExposeAnnotationSerializationExclusionStrategy.java OK 
    testing: com/google/gson/FieldAttributes.java OK 
    testing: com/google/gson/FieldNamingPolicy.java OK 
    testing: com/google/gson/FieldNamingStrategy.java OK 
    testing: com/google/gson/FieldNamingStrategy2.java OK 
    testing: com/google/gson/FieldNamingStrategy2Adapter.java OK 
    testing: com/google/gson/Gson.java OK 
    testing: com/google/gson/GsonBuilder.java OK 
    testing: com/google/gson/GsonToMiniGsonTypeAdapterFactory.java OK 
    testing: com/google/gson/InnerClassExclusionStrategy.java OK 
    testing: com/google/gson/InstanceCreator.java OK 
    testing: com/google/gson/internal/$Gson$Preconditions.java OK 
    testing: com/google/gson/internal/$Gson$Types.java OK 
    testing: com/google/gson/internal/bind/ArrayTypeAdapter.java OK 
    testing: com/google/gson/internal/bind/BigDecimalTypeAdapter.java OK 
    testing: com/google/gson/internal/bind/BigIntegerTypeAdapter.java OK 
    testing: com/google/gson/internal/bind/CollectionTypeAdapterFactory.java OK 
    testing: com/google/gson/internal/bind/DateTypeAdapter.java OK 
    testing: com/google/gson/internal/bind/ExcludedTypeAdapterFactory.java OK 
    testing: com/google/gson/internal/bind/JsonElementReader.java OK 
    testing: com/google/gson/internal/bind/JsonElementWriter.java OK 
    testing: com/google/gson/internal/bind/MapTypeAdapterFactory.java OK 
    testing: com/google/gson/internal/bind/MiniGson.java OK 
    testing: com/google/gson/internal/bind/ObjectTypeAdapter.java OK 
    testing: com/google/gson/internal/bind/Reflection.java OK 
    testing: com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java OK 
    testing: com/google/gson/internal/bind/SqlDateTypeAdapter.java OK 
    testing: com/google/gson/internal/bind/StringToValueMapTypeAdapterFactory.java OK 
    testing: com/google/gson/internal/bind/TimeTypeAdapter.java OK 
    testing: com/google/gson/internal/bind/TypeAdapter.java OK 
    testing: com/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper.java OK 
    testing: com/google/gson/internal/bind/TypeAdapters.java OK 
    testing: com/google/gson/internal/ConstructorConstructor.java OK 
    testing: com/google/gson/internal/LazilyParsedNumber.java OK 
    testing: com/google/gson/internal/ObjectConstructor.java OK 
    testing: com/google/gson/internal/package-info.java OK 
    testing: com/google/gson/internal/Pair.java OK 
    testing: com/google/gson/internal/ParameterizedTypeHandlerMap.java OK 
    testing: com/google/gson/internal/Primitives.java OK 
    testing: com/google/gson/internal/Streams.java OK 
    testing: com/google/gson/internal/UnsafeAllocator.java OK 
    testing: com/google/gson/JavaFieldNamingPolicy.java OK 
    testing: com/google/gson/JsonArray.java OK 
    testing: com/google/gson/JsonDeserializationContext.java OK 
    testing: com/google/gson/JsonDeserializer.java OK 
    testing: com/google/gson/JsonDeserializerExceptionWrapper.java OK 
    testing: com/google/gson/JsonElement.java OK 
    testing: com/google/gson/JsonElementVisitor.java OK 
    testing: com/google/gson/JsonIOException.java OK 
    testing: com/google/gson/JsonNull.java OK 
    testing: com/google/gson/JsonObject.java OK 
    testing: com/google/gson/JsonParseException.java OK 
    testing: com/google/gson/JsonParser.java OK 
    testing: com/google/gson/JsonPrimitive.java OK 
    testing: com/google/gson/JsonSerializationContext.java OK 
    testing: com/google/gson/JsonSerializer.java OK 
    testing: com/google/gson/JsonStreamParser.java OK 
    testing: com/google/gson/JsonSyntaxException.java OK 
    testing: com/google/gson/LongSerializationPolicy.java OK 
    testing: com/google/gson/LowerCamelCaseSeparatorNamingPolicy.java OK 
    testing: com/google/gson/LowerCaseNamingPolicy.java OK 
    testing: com/google/gson/LruCache.java OK 
    testing: com/google/gson/ModifierBasedExclusionStrategy.java OK 
    testing: com/google/gson/ModifyFirstLetterNamingPolicy.java OK 
    testing: com/google/gson/package-info.java OK 
    testing: com/google/gson/RecursiveFieldNamingPolicy.java OK 
    testing: com/google/gson/reflect/package-info.java OK 
    testing: com/google/gson/reflect/TypeToken.java OK 
    testing: com/google/gson/SerializedNameAnnotationInterceptingNamingPolicy.java OK 
    testing: com/google/gson/stream/JsonReader.java OK 
    testing: com/google/gson/stream/JsonScope.java OK 
    testing: com/google/gson/stream/JsonToken.java OK 
    testing: com/google/gson/stream/JsonWriter.java OK 
    testing: com/google/gson/stream/MalformedJsonException.java OK 
    testing: com/google/gson/stream/StringPool.java OK 
    testing: com/google/gson/SyntheticFieldExclusionStrategy.java OK 
    testing: com/google/gson/UpperCamelCaseSeparatorNamingPolicy.java OK 
    testing: com/google/gson/UpperCaseNamingPolicy.java OK 
    testing: com/google/gson/VersionConstants.java OK 
    testing: com/google/gson/VersionExclusionStrategy.java OK 
No errors detected in compressed data of ./lib/sources/gson-sources.jar. 
+0

Lo tengo trabajando, gracias! Lástima que se necesita alguna redundancia (por separado para binarios y fuentes) pero bueno. Por cierto, dejé 'conf =" binaries-> default "' en ivy.xml y 'conf =" binaries "' en build.xml ya que funciona igual sin ellos. – Jonik

+0

No, espere, no funciona para las fuentes:/Pensé que en realidad descargó los archivos fuente, pero en realidad obtuvo los archivos binarios dos veces y también los puso en el directorio fuente. ¿Algunas ideas? – Jonik

+0

Mi ejemplo funciona. Para controlar el contenido de cada configuración, debe especificar la asignación explícita entre la configuración local y la remota ("alcance" en el lenguaje de Maven). Usar conf = "binarios" no funcionará. Maven no es compatible con un alcance llamado "binarios". –

0

que tenía problemas similares, pero con una situación un poco más complicada para la cual la solución provista no ork. Tenía un archivo principal ivy.xml que no definía ninguna configuración, así que heredó la configuración predeterminada que se crea sin que siquiera lo note (consulte doc). La aplicación de una configuración "principal" recién hecha en todas las dependencias acaba de romper la construcción. No tuve más remedio que definir un nuevo módulo en otro archivo, digamos ivy_extra.xml, y cargarlo en un nuevo objetivo, ¡tan simple como eso! archivo

Ejemplo:

<!-- ivy_extra.xml --> 
<ivy-module version="2.0"> 
    <info organisation="com.myorg" module="mymodule"/> 
    <configurations> 
     <conf name="download" visibility="private" /> 
    </configurations> 
    <dependencies> 
     <dependency org="com.google.guava" name="guava" rev="10.0.1" conf="download->default"/> 
    </dependencies> 
</ivy-module> 

cargado en su build.xml así:

<target name="download-guava" description="Retrieve guava"> 
    <echo>Retrieving guava</echo> 
    <ivy:resolve file="ivy_agent.xml"/> 
    <ivy:retrieve conf="download" type="jar" pattern="guava/[artifact]-[revision].jar"/> 
</target> 
Cuestiones relacionadas