2011-12-29 25 views
15

jestem w sumie newbie z bluszczu i zostały próbuje ją bardzo prosto, do pobierania powszechnie używanych bibliotek takich jak Guava i Gson które są available w centralnym repozytorium Maven:Jak powiedzieć Ivy, aby umieścić pobrane słoiki w niestandardowym katalogu?

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

W systemie Windows, przez domyślnie Ivy przechowuje swoje pliki w %USERPROFILE%\.ivy2\cache\; na systemach Unix-y są one pobierane pod numerem $HOME/.ivy2/.

przypuszczam to dość podstawowe pytanie: jak powiedzieć Ivy pobrać oba pliki binarne i źródła, i umieścić w jednym słoików binarne (dowolnych) katalog źródłowych i słoików w innym katalogu?

Na przykład chciałbym Ivy umieścić wszystkie pobrane binarne słoiki w [project_home]/WebContent/WEB-INF/lib.

Należy zauważyć, że używam Ivy przez Ant, wzdłuż następujących linii, a nie wtyczki 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> 

Odpowiedz

7

~/.ivy2 to tylko ivy cache.

Musisz ustawić wzór na ivy retrieve. To określi, gdzie pobierane są zależności.

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

A może drugi odzyskać dla źródeł:

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

Będzie to również działa, i umieścić zależności źródeł i słoików w różnych katalogach:

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

Zależy w jaki sposób źródła/słoiki są wyznaczone w twoim repozytorium.

I na marginesie: taskdef musi nadejść przed użyciem zadania.

I należy zdefiniować resolwer w m2compatible:

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

Dzięki! Próbuję tego typu konfiguracji, ale teraz dostaję błąd: "Plik raportu" ~/.ivy2/cache/com.company-foobar-jars.xml "nie istnieje". Wydaje się dziwne, jeśli muszę ręcznie utworzyć taki plik pod katalogiem pamięci podręcznej bluszcz ... Czy jest jeszcze coś brakuje w mojej konfiguracji Ivy? – Jonik

+0

@Jonik trudno powiedzieć, czy wykonałeś przed pobraniem? – oers

+0

Nie; Próbowałem dodać , ale nadal otrzymuję ten sam błąd. Z komunikatów o błędach wydaje mi się, że nie mogę po prostu dodać 'conf =" słoików "' w wywołaniu bez zdefiniowania gdzieś konfiguracji "jar": 'nie znaleziono konfiguracji zapytań w com.company # foobar; @jonik: jars'. Ale jak to zrobić? – Jonik

16

Innym SO answer opisano sposób konfiguracje są wykorzystywane do prowadzenia grup w zależności rozdzielić. Ten problem może jednak wymagać, aby zależności były deklarowane więcej niż jeden raz, aby pasowały do ​​różnych konfiguracji bluszczu.

Spróbuj wykonać następujące czynności:

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> 

Uwaga: zaktualizowana dodać cel, który czyści bluszcz cache.

Budowa prowadzona jest w następujący sposób, aby zapewnić artefakty są świeżo pobrane:

$ ant clean-all resolve 

Wynik

$ 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 

Dowód, że artefakt źródłowy zawiera pliki 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

Rozumiem, dziękuję! Szkoda, że ​​potrzebna jest pewna redundancja (oddzielne dla binariów i źródeł), ale no cóż. Btw, odrzuciłem "conf =" binaria-> default "' w ivy.xml i 'conf =" binaries "' w build.xml, ponieważ działa bez nich. – Jonik

+0

Nie, czekaj, to nie działa dla źródeł:/Myślałem, że faktycznie pobrało słoiki z materiałem źródłowym, ale w rzeczywistości dwukrotnie otrzymało binarne słoiki i umieściło je również pod katalogiem źródłowym. Jakieś pomysły? – Jonik

+0

Mój przykład działa. Aby kontrolować zawartość każdej konfiguracji, należy określić jawne odwzorowanie pomiędzy konfiguracją lokalną i zdalną ("zakres" w języku Maven). Używanie conf = "binaries" nie będzie działać. Maven nie obsługuje zakresu zwanego "binariami". –

0

miałem podobne problemy, ale z nieco trudniejszą sytuacją, dla której dostarczone rozwiązanie nie miało miejsca ork. Miałem główny plik ivy.xml, który nie definiował żadnej konfiguracji, więc odziedziczył domyślną konfigurację, która zostanie utworzona bez twojej wiedzy (patrz doc). Zastosowanie świeżo stworzonego "głównego" conf dla wszystkich zależności właśnie zepsuło kompilację. Nie miałem innego wyjścia, jak zdefiniować nowy moduł w innym pliku, na przykład ivy_extra.xml, i załadować go w nowy cel, prosty w tym!

Przykład file:

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

załadowanych do build.xml tak:

<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> 
Powiązane problemy