2011-12-29 28 views
15

Tôi là một newbie tổng số với Ivy, và đã cố gắng nó ra rất đơn giản, cho lấy thư viện thường được sử dụng như GuavaGsonavailable trong kho Maven Trung ương:Làm thế nào để nói với Ivy để đặt các lọ đã tải xuống trong một thư mục tùy chỉnh?

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

Trên Windows, bằng cách mặc định, Ivy lưu trữ các tệp của nó trong %USERPROFILE%\.ivy2\cache\; trên các hệ thống Unix-y, chúng được tải xuống dưới $HOME/.ivy2/.

Tôi cho rằng đây là câu hỏi khá cơ bản: cách yêu cầu Ivy tải xuống cả hai tệp nhị phân và nguồn, và đặt các bình nhị phân vào một thư mục (tùy ý) và các lọ nguồn trong một thư mục khác?

Ví dụ: tôi muốn Ivy đặt tất cả các lọ nhị phân đã tải xuống vào [project_home]/WebContent/WEB-INF/lib.

Lưu ý rằng tôi đang sử dụng Ivy qua Ant, dọc theo các dòng sau, không phải là plugin 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> 

Trả lời

7

~/.ivy2 chỉ là ivy cache.

Bạn phải đặt mẫu thành ivy retrieve. Điều này sẽ xác định nơi phụ thuộc được tải xuống.

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

Và có lẽ một giây lấy cho nguồn:

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

này cũng sẽ làm việc, và đặt sự phụ thuộc nguồn và lọ trong các thư mục khác nhau:

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

Nó phụ thuộc vào cách nguồn/lọ được chỉ định trong kho lưu trữ của bạn.

Và trên ghi chú bên: taskdef phải đến trước khi sử dụng tác vụ.

Và bạn nên xác định giải quyết như m2compatible:

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

Cảm ơn! Tôi đang thử loại thiết lập này, nhưng bây giờ tôi nhận được lỗi: "Báo cáo tệp '~/.ivy2/cache/com.company-foobar-jars.xml' không tồn tại". Nó có vẻ lạ nếu tôi cần phải tự tạo ra các tập tin như vậy theo dir dir ivy ... Vẫn còn một cái gì đó mất tích trong cấu hình Ivy của tôi? – Jonik

+0

@Jonik khó nói, bạn đã thực hiện trước khi truy xuất? – oers

+0

Không; Tôi đã thử thêm nhưng vẫn gặp lỗi tương tự. Từ các thông báo lỗi, có vẻ như tôi không thể đơn giản thêm 'conf =" jars "' vào một call mà không định nghĩa cấu hình "jars" ở đâu đó: 'cấu hình được hỏi không tìm thấy trong com.company # foobar; @jonik: jars'. Nhưng làm thế nào để làm điều đó? – Jonik

16

SO answer Một mô tả cách cấu hình được sử dụng để giữ cho nhóm phụ thuộc riêng biệt. Tuy nhiên, vấn đề này có thể yêu cầu các phụ thuộc được khai báo nhiều hơn một lần để phù hợp với các cấu hình ivy khác nhau.

Hãy thử như sau:

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> 

Lưu ý: Cập nhật để thêm mục tiêu mà thanh trừng bộ nhớ cache ivy.

xây dựng được điều hành như sau, để đảm bảo vật được tươi tải:

$ ant clean-all resolve 

quả

$ 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 

Proof rằng artifact nguồn chứa 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

Đã làm việc, cảm ơn! Quá xấu một số dự phòng là cần thiết (riêng biệt cho các tệp nhị phân và nguồn) nhưng tốt thôi. Btw, tôi đã bỏ qua 'conf =" binaries-> default "' trong ivy.xml và 'conf =" binaries "' trong tệp build.xml vì nó hoạt động giống nhau mà không có chúng. – Jonik

+0

Không, chờ đã, nó không hoạt động với các nguồn:/Tôi nghĩ nó thực sự đã tải xuống các lọ nguồn, nhưng trên thực tế nó có các lọ nhị phân hai lần và đặt chúng dưới thư mục nguồn. Bất kỳ ý tưởng? – Jonik

+0

Ví dụ của tôi hoạt động. Để kiểm soát nội dung của mỗi cấu hình bạn cần xác định ánh xạ rõ ràng giữa cấu hình cục bộ và từ xa ("phạm vi" trong cách nói Maven). Sử dụng conf = "binary" sẽ không hoạt động. Maven không hỗ trợ phạm vi được gọi là "nhị phân". –

0

tôi đã các vấn đề tương tự, nhưng với một tình huống phức tạp hơn một chút mà giải pháp được cung cấp không ork. Tôi đã có tệp ivy.xml chính xác định không có cấu hình, vì vậy kế thừa cấu hình mặc định được tạo mà không cần bạn chú ý đến nó (xem doc). Áp dụng một "chính" mới conf trên tất cả các phụ thuộc chỉ phá vỡ xây dựng. Tôi không có lựa chọn nào khác ngoài việc xác định một mô-đun mới trong một tệp khác, nói ivy_extra.xml và tải nó vào một mục tiêu mới, đơn giản như vậy! tập tin

Ví dụ:

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

Loaded trong build.xml của bạn như thế:

<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> 
Các vấn đề liên quan