2011-12-29 9 views
15

Sono un newbie totale con Ivy, e hanno cercato fuori in modo molto semplice, per andare a prendere le librerie di uso comune come Guava e Gson che sono available nel repository centrale Maven:Come dire a Ivy di mettere i jar scaricati in una directory personalizzata?

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

su Windows, di default, Ivy memorizza i suoi file in %USERPROFILE%\.ivy2\cache\; su sistemi Unix-y, vengono scaricati sotto $HOME/.ivy2/.

Suppongo che questo sia abbastanza domanda di fondo: come dire Ivy per scaricare entrambi i binari e sorgenti, e per mettere i vasi binari in una (arbitraria) di directory di origine e di vasi in un'altra directory?

Ad esempio, vorrei che Ivy inserisca tutti i barattoli binari scaricati in [project_home]/WebContent/WEB-INF/lib.

Nota che sto utilizzando Ivy tramite Ant, lungo le linee seguenti, non un plug-in 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> 

risposta

7

~/.ivy2 è solo il ivy cache.

È necessario impostare un modello su ivy retrieve. Questo definirà dove vengono scaricate le dipendenze.

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

E forse un secondo recuperare per le sorgenti:

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

Questo sarà anche il lavoro, e mettere le dipendenze di fonti e vasi in diverse directory:

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

Dipende da come sorgenti/vasi sono designati nel tuo repository.

E su un lato nota: il taskdef deve venire prima di utilizzare un'attività.

E si dovrebbe definire il resolver come m2compatible:

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

Grazie! Sto provando questo tipo di installazione, ma ora ricevo l'errore: "Segnala file" ~/.ivy2/cache/com.company-foobar-jars.xml "non esiste". Sembra strano se ho bisogno di creare manualmente tale file sotto la directory ivy cache ... C'è ancora qualcosa che manca nella mia configurazione Ivy? – Jonik

+0

@Jonik difficile da dire, hai eseguito prima di recuperarlo? – oers

+0

No; Ho provato ad aggiungere ma ho ancora lo stesso errore. Dai messaggi di errore, sembra che non possa semplicemente aggiungere 'conf =" jars "' in una chiamata senza definire la configurazione "jars" da qualche parte: 'ha chiesto la configurazione non trovata in com.company # foobar; @jonik: vasetti ». ma come farlo? – Jonik

16

Un'altra SO answer descrive come le configurazioni vengono utilizzati per mantenere i gruppi delle dipendenze separano. Questo problema tuttavia potrebbe richiedere che le dipendenze vengano dichiarate più di una volta per adattarsi a diverse configurazioni di edera.

provare quanto segue:

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: aggiornato per aggiungere obiettivo che elimina cache di edera.

Corporatura viene eseguito come segue, al fine di garantire gli artefatti sono appena scaricato:

$ ant clean-all resolve 

Risultato

$ 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 prova che il manufatto di origine contiene i file 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

Funziona, grazie! Peccato che sia necessaria una certa ridondanza (separato da per i binari e le fonti) ma vabbè. A proposito, ho omesso 'conf =" binari-> default "' in ivy.xml e 'conf =" binari "' in build.xml perché funziona allo stesso modo senza di loro. – Jonik

+0

No, aspetta, non funziona per i sorgenti:/Ho pensato che in realtà scaricava i giare sorgente, ma in effetti ha ottenuto i binari binari due volte e li ha messi anche sotto la directory di origine. Qualche idea? – Jonik

+0

Il mio esempio funziona. Per controllare il contenuto di ciascuna configurazione è necessario specificare la mappatura esplicita tra configurazione locale e remota ("scope" in linguaggio Maven). L'utilizzo di conf = "binari" non funzionerà. Maven non supporta un oscilloscopio chiamato "binari". –

0

ho avuto problemi simili, ma con una situazione un po 'più complicata per la quale la soluzione fornita non era w ork. Ho avuto un file principale ivy.xml che non ha definito alcuna configurazione, quindi ha ereditato la configurazione predefinita che viene creata senza nemmeno accorgercene (vedere doc). L'applicazione di una configurazione "principale" appena creata su tutte le dipendenze ha appena rotto la build. Non ho avuto altra scelta che definire un nuovo modulo in un altro file, ad esempio ivy_extra.xml, e caricarlo in un nuovo target, semplice come quello! file di

Esempio:

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

caricato nel build.xml così:

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