2014-09-24 20 views
10

Tôi đang làm việc trên một dự án bao gồm hai dự án thư viện Android. Khi tôi tải các thư viện này lên repo Maven của tôi (Nexus), pom được tạo ra không bao gồm phần tử <type>aar</type> trong phần phụ thuộc.Dự án thư viện Android phụ thuộc tạm thời lỏng AAR loại

Dưới đây là tôi cây phụ thuộc

* App1 
\ 
    * lib1 
    |\ 
    | * lib2 
    * Other libs 

Bạn có thể nhìn thấy trong sơ đồ này mà app của tôi phụ thuộc vào lib1, mà phụ thuộc vào lib2. Cả hai thư viện đều là các dự án thư viện Android, do đó AARs.

Lib1/build.gradle

apply plugin: 'com.android.library' 
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' 

android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 

    defaultConfig { 
     minSdkVersion rootProject.ext.minSdkVersion 
     targetSdkVersion 20 
     versionCode 1 
     versionName "1.0" 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    provided project(':lib2') 

    compile 'com.squareup.picasso:picasso:2.3.3' 
} 

Lib2/build.gradle

apply plugin: 'com.android.library' 
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' 

android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 

    defaultConfig { 
     minSdkVersion rootProject.ext.minSdkVersion 
     targetSdkVersion 19 
     versionCode 1 
     versionName '1.0' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:19.+' 
    compile 'com.squareup.retrofit:retrofit:1.6.1' 
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' 
    compile 'com.squareup.okhttp:okhttp:2.0.0' 
} 

Chú ý cách Lib1 bao gồm Lib2 như một sự phụ thuộc project().

Bây giờ, khi tôi triển khai điều này bằng cách sử dụng plugin tuyệt vời gradle-mvn-push của Chris Banes, mọi thứ hoạt động như mong đợi. Chỉ có một sự kỳ quặc mà tôi nhận thấy trong tệp pom.xml được tạo ra.

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>lib2</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <scope>compile</scope> 
    </dependency> 
    ... 
</dependencies> 

Lưu ý rằng plugin mavenDeployer đã bỏ yếu tố phụ thuộc khi nó tạo ra pom.

Trong dự án ứng dụng của tôi (đó là một dự án maven), tôi đã phụ thuộc này được liệt kê:

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>lib1</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>aar</type> 
    </dependency> 
    ... 
</dependencies> 

Khi cố gắng xây dựng này với Maven, tôi nhận được các lỗi sau.

Could not resolve dependencies for project com.example:app:apk:1.0.0-SNAPSHOT: The following artifacts could not be resolved: com.example:lib2:jar:0.0.1-SNAPSHOT 

Lưu ý cách tìm phiên bản jar của thư viện. Tôi tin rằng, vì plugin mavenDeployer không được tạo ra <type>aar</type> trong danh sách phụ thuộc của pom được tạo ra, maven là mặc định để tìm kiếm một cái bình.

Có ai biết cách xây dựng các dự án thư viện Android bao gồm các phụ thuộc tạm thời với Gradle không?

+2

Cùng một vấn đề ở đây. – sarfata

Trả lời

0

Chỉ cần thêm aar vào pom với bất kỳ trình soạn thảo văn bản nào. Sau đó, mở một bàn điều khiển vào thư mục gốc của dự án (vị trí của pom) và chạy "mvn clean install". Các tạo tác aar sẽ được tạo và triển khai cho repo maven của bạn.

Trong mọi trường hợp, việc tạo thư viện aar với Maven dễ dàng hơn rất nhiều. Chỉ cần tạo một Dự án Maven sử dụng bất kỳ kiểu thư viện android nào (The de.akquinet là khá tốt, nhưng bạn phải sử dụng phiên bản plugin giữa 3.8.2 và 3.9, http://mvnrepository.com/artifact/de.akquinet.android.archetypes). Chỉ cần tạo dự án, thêm các thư viện và sau đó chạy lệnh "mvn clean install" để cài đặt chúng vào thư mục maven cục bộ của bạn. Sau đó, chỉ cần sử dụng chúng như phụ thuộc aar bình thường.

+0

Vấn đề không phải là tạo dự án thư viện, đó là dự án thư viện có phụ thuộc vào thư viện AAR khác, khi được triển khai bằng mavenDeployer (uploadArchives), không giữ lại phần aar của phần tử phụ thuộc trong pom, cố gắng giải quyết những phụ thuộc tạm thời đó như các lọ (mặc định). – rharter

+0

Tôi hiểu điều đó. Nhưng giả sử tất cả mọi thứ khác trong pom là okay, chỉ cần thêm các loại thiếu và chạy maven bằng tay sẽ tạo ra các aars. –

+0

Chắc chắn, nhưng tại thời điểm đó, tôi tự xây dựng các phụ thuộc của tôi, điều này phủ nhận lợi ích quản lý phụ thuộc tự động mà tôi sử dụng cho maven. Tôi cần để có thể phân phối các thư viện phụ thuộc vào các thư viện khác mà không cần báo trước rằng mọi người dùng cần phải tải xuống các phụ thuộc theo cách thủ công, sửa đổi pom và xây dựng chúng cục bộ. – rharter

0

Hãy thử loại bỏ cơn giận dữ. Nó sửa chữa tất cả điều này ... ehm ... thứ. Cụ thể là pom không hợp lệ và/hoặc không chính xác được tạo bởi gradle. Xác nhận giải pháp làm việc để xuất bản lên sonatype oss/maven central. Không có chỉnh sửa pom thủ công, hỗ trợ chữ ký pgp và nhiều hơn nữa.

Site: https://github.com/gradle-fury/gradle-fury

Cụ thể, bạn cần kịch bản gradle maven-hỗ trợ mà làm tất cả công việc cho bạn. Tất cả những thứ bình thường trong pom được lưu trữ trong gradle.properties. Hỗ trợ các biến thể android nữa, các tệp chiến tranh, (sẽ sớm sửa lỗi cho distZip), javadocs và các jars nguồn và hơn thế nữa.

Tuyên bố từ chối trách nhiệm, tôi làm việc trên đó

Chỉnh sửa: thêm một chút thông tin. Mặc dù fury không tiêm phụ thuộc và gõ chính xác cho các thư viện AAR, plugin gradle-android (thứ mà google tạo) không tôn trọng phần phụ thuộc và bỏ qua nó. Về cơ bản phụ thuộc transitive của dự án AAR không được hỗ trợ. Không có ý tưởng tại sao

Các vấn đề liên quan