【问题标题】:Exclude jar-library from aar从 aar 中排除 jar 库
【发布时间】:2016-07-29 12:03:26
【问题描述】:

我有一个库项目,它依赖于从项目 libs 目录加载的 cordova.jar。

我将这个库项目作为 aar 部署到 maven nexus。

在一个应用程序项目中,我依赖于库项目 aar(编译 ...)。但是应用项目对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)

为了解决这个问题,我尝试在我的应用程序项目中加载库 aar 时排除 cordova.jar:

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

但这不起作用。我做错了吗?

我的第二个问题是:

是否可以在将库项目作为 aar 上传时排除 /libs/cordova.jar,而不是在应用程序中加载库时排除 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
}

### 更新###

我按照 Xaver Kapeller 的建议尝试了“提供”的 gradle 范围(谢谢!)。但是还是有cordova.jar 打包进aar。提供的范围根本不起作用还是我遗漏了什么?

【问题讨论】:

  • 不要使用compile 配置,而是使用provided。这意味着该库不会被打包到您的 aar 中!
  • 听起来很完美,但不起作用。我将编译文件('libs/cordova-5.1.1.jar')更改为提供的文件('libs/cordova-5.1.1.jar'),但cordova-5.1.1.jar仍然打包到aar中。
  • 这是不可能的。请发布您的完整 build.gradle,以便我查看。
  • 请查看更新后的问题...

标签: android gradle aar


【解决方案1】:

您可以简单地将库文件从 dir yourmodule/libs 移动到 dir yourmoudle/ 并将“provided files('libs/yourlibrary.jar')”修改为“provided files('yourlibrary.jar')”。

然后清理项目并重建。

【讨论】:

  • 这个非常简单的答案在无数其他人失败的情况下奏效。(stackoverflow.com/a/41700243/4571656) 非常感谢。
  • 哇,工作就像一个魅力,我可以知道根本原因吗?它是如何工作的?
【解决方案2】:

尝试compileOnly关键字来标记资源仅用于编译。

Check answer

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多