2014-08-30 25 views
5

Tôi đang cố gắng xây dựng thư viện android sử dụng thư viện 'lõi' của java (myLibrary-core). Tôi đã gặp vấn đề với phụ thuộc của tôi để hiển thị trong tệp pom được tạo của tôi, nhưng tôi (nghĩ rằng tôi) đã sửa nó bằng câu trả lời trong câu hỏi này: Gradle not including dependencies in published pom.xmlNhập thư viện android của tôi vào một ứng dụng không được nhận dạng là thư viện

Tôi đang cố gắng giải quyết tại sao nhập thư viện của mình vào ứng dụng riêng biệt cho lỗi này. Đây là lỗi tôi nhận được khi tôi nhập viện vào một dự án như một sự phụ thuộc gradle:

Error:Module version com.example:myLibrary:0.1.0 depends on libraries but is not a library itself 

Đây là build.gradle tôi:

apply plugin: 'android-sdk-manager' 
apply plugin: 'com.android.library' 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.12.+' 
     classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+' 
    } 
} 

apply plugin: 'maven-publish' 

group = 'com.example' 
version = '0.1.0' 

android { 
    compileSdkVersion 19 
    buildToolsVersion '19.1.0' 

    defaultConfig { 
     applicationId "com.example.android" 
     minSdkVersion 11 
     targetSdkVersion 19 
     versionCode 1 
     versionName "0.1.0" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    packagingOptions { 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/DEPENDENCIES' 
    } 
} 

dependencies { 
// compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:20.0.0' 
    compile 'com.example:myLibrary-core:0.1.2' 
    compile 'com.android.support:support-v13:20.0.0' 
    compile 'com.google.android.gms:play-services:+' 
} 

// build JAR file 
task androidReleaseJar(type: Jar, dependsOn: assembleRelease) { 
    from "$buildDir/intermediates/classes/release/" 
} 

publishing { 
    publications { 
     maven(MavenPublication) { 
      artifact androidReleaseJar { 
       classifier "sources" 
      } 

      //The publication doesn't know about our dependencies, so we have to manually add them to the pom 
      pom.withXml { 
       def dependenciesNode = asNode().appendNode('dependencies') 

       //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each 
       configurations.compile.allDependencies.each { 
        def dependencyNode = dependenciesNode.appendNode('dependency') 
        dependencyNode.appendNode('groupId', it.group) 
        dependencyNode.appendNode('artifactId', it.name) 
        dependencyNode.appendNode('version', it.version) 
       } 
      } 
     } 
    } 
} 

} 

này tạo ra các tập tin pom:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</groupId> 
    <artifactId>myLibrary</artifactId> 
    <version>0.1.0</version> 
    <packaging>pom</packaging> 
    <dependencies> 
    <dependency> 
     <groupId>com.android.support</groupId> 
     <artifactId>appcompat-v7</artifactId> 
     <version>20.0.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>myLibrary-core</artifactId> 
     <version>0.1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.android.support</groupId> 
     <artifactId>support-v13</artifactId> 
     <version>20.0.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.android.gms</groupId> 
     <artifactId>play-services</artifactId> 
     <version>+</version> 
    </dependency> 
    </dependencies> 
</project> 

Điều kỳ lạ là nếu tôi xóa các dịch vụ phát, hỗ trợ-v13 và appcompat-v7, lỗi sẽ biến mất. Tôi không thể nghĩ ra bất cứ điều gì khác để thử vì vậy tôi rất vui khi thử bất cứ đề nghị nào được thực hiện.

+0

Tôi biết cách làm điều này với adl eclipse. alt-nhập vào từng dự án. Thư viện nhấp chuột islibary và dự án khác bạn bấm vào dự án thư viện. – danny117

+0

@ danny117 Điều này dường như không liên quan đến tình hình của tôi. Tệp pom có ​​được tạo đúng cách không và bạn có thể nhập dự án thư viện của mình trong một ứng dụng qua gradle không? – jonalmeida

+0

Tôi thực sự chỉ biết một phương pháp cho nhật thực. Khi android studio hết beta, tôi sẽ xem xét nó. Hãy xem ở đây thiết lập gradle với Android Studio cho một dự án thư viện. http://developer.android.com/sdk/installing/studio-build.html – danny117

Trả lời

7

Plugin Android không thể sử dụng phụ thuộc POM; nó chỉ có thể đối phó với các thư viện JAR hoặc AAR. Đó là điều này có nghĩa là: com.example:myLibrary tùy thuộc vào thư viện (appcompat-v7, myLibrary-core, support-v13 và play-services) nhưng không phải là thư viện (plugin Android Gradle không xử lý <packaging>pom</packaging>).

Tôi biết điều này gây nhầm lẫn vì Android-Gradle tiêu hóa tệp .pom của mô-đun để giải quyết các phụ thuộc của nó và như vậy, nhưng không thể xử lý các thư viện sử dụng làm bao bì của họ.

Nếu bạn muốn tạo mô-đun có thể được tiêu thụ bởi plugin Android-Gradle, nó sẽ cần phải được đóng gói như JAR hoặc AAR.

+0

Cảm ơn Scott! Tôi sẽ phải suy nghĩ lại cách tôi gói thư viện của mình trong trường hợp đó. – jonalmeida

+0

Đó là một hạn chế lớn phải không? Ý tôi là, có lẽ 90% thư viện sẽ có sự phụ thuộc vào thư viện khác. Hay tôi đang thiếu một cái gì đó? –

+0

Nếu bạn có thư viện Android trong hệ thống xây dựng Gradle (không phải thư viện Java đơn giản, nhưng thư viện sử dụng API Android và chứa tài nguyên Android và xây dựng artfiacts), thì chỉ có thể dựa vào các thư viện khác được đóng gói là JAR hoặc AAR. Điều đó dường như không phải là một hạn chế nghiêm trọng; JAR khá chuẩn, và AAR là cách thư viện Android được đóng gói từ Gradle builds. Nó sẽ được tốt đẹp nếu nó có thể hỗ trợ apklib là tốt, nhưng điều đó dường như không có khả năng. –

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