2016-07-29 205 views
2

我有一個庫項目,它對從項目libs目錄加載的cordova.jar具有依賴性。從aar中排除jar庫

這個庫項目我作爲aar部署到maven nexus。

在一個應用程序項目中,我對庫項目aar(compile ...)有依賴關係。但是應用程序項目與cordova.jar具有相同的依賴關係。

所以建立了一個應用項目時,我得到這個錯誤:

:transformClassesWithDexForDebug 
UNEXPECTED TOP-LEVEL EXCEPTION: 
com.android.dex.DexException: Multiple dex files define Lorg/apache/cordova/AuthenticationToken; 
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579) 
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535) 
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517) 
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164) 
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188) 
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504) 
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334) 
    at com.android.dx.command.dexer.Main.run(Main.java:277) 
    at com.android.dx.command.dexer.Main.main(Main.java:245) 
    at com.android.dx.command.Main.main(Main.java:106) 

爲了解決這個問題,我試圖排除cordova.jar在我的應用程序加載的項目庫AAR時:

dependencies { 
    compile ('com.my.library:hybridstory:1.0'){ 
     exclude (group: 'org.apache.cordova') 
    } 
} 

但這不起作用。難道我做錯了什麼?

我的第二個問題是:

是否可以排除/libs/cordova.jar上傳時爲AAR庫項目,而不是在應用程序中加載庫時不包括cordova.jar?我怎麼能與此gradle這個實現這一目標:

apply plugin: 'com.android.library' 
apply plugin: 'maven' 

archivesBaseName = 'hybridstory' 
group = 'com....' 
version = '16.3.0-SNAPSHOT' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 22 
     versionCode 1 
     versionName version 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    provided files('libs/cordova-5.1.1.jar') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com....' 
} 

task createJavadoc(type: Javadoc) { 
    source = android.sourceSets.main.java.srcDirs 
    title = archivesBaseName + " " + version 
    options.overview = "src/main/doc-files/overview.html" 
    doLast { 
     copy { 
      from "src/main/doc-files" 
      into "$buildDir/docs/javadoc" 
     } 
    } 
} 

uploadArchives { 
    repositories { 
     mavenDeployer { 
      repository(url: 'https://maven..../content/repositories/om-releases/') 
      snapshotRepository(url: 'https://maven..../content/repositories/om-snapshots/') 
     } 
    } 
} 

task androidJavadocsJar(type: Jar, dependsOn: createJavadoc) { 
    classifier = 'javadoc' 
    from createJavadoc.destinationDir 
} 

task androidSourcesJar(type: Jar) { 
    classifier = 'sources' 
    from android.sourceSets.main.java.srcDirs 
} 

artifacts { 
    archives androidSourcesJar 
    archives androidJavadocsJar 
} 

### UPDATE ###

我試過gradle這個範圍 「規定」 由克薩韋爾Kapeller的建議(感謝!)。但是仍然有cordova.jar打包到aar中。提供的範圍是不是工作或者我錯過了什麼?

+1

而不是使用'compile'配置use'provided'。這意味着圖書館不會被包裝進你的耳朵! –

+1

聽起來很完美,但不起作用。我將編譯文件('libs/cordova-5.1.1.jar')更改爲提供的文件('libs/cordova-5.1.1.jar'),但cordova-5.1.1.jar仍然打包到aar中。 – rickul

+0

這是不可能的。請發佈完整的build.gradle,以便我可以看一看。 –

回答

9

您可以簡單地將庫文件從dir yourmodule/libs移動到dir yourmoudle/ ,並在依賴項中將「提供的文件('libs/yourlibrary.jar')」修改爲「提供的文件('yourlibrary.jar')」 。

然後清理項目並重建。

+0

這非常簡單的答案工作無數人失敗。(http://stackoverflow.com/a/41700243/4571656)非常感謝。 –

+0

boooom,這是真正的交易。謝謝! – turnipinrut