Android Studio(IntelliJ)和gradle,如何添加不同版本的依赖项?

时间:2015-05-22 13:06:55

标签: android intellij-idea android-gradle

我的项目中需要json-lib。

我已将json-lib添加到我的gradle依赖项中,而这又依赖于各种公共库。

这是我的app / build.gradle的相关部分(根据以下Médéric的建议更新)

dependencies {
    compile 'commons-collections:commons-collections:3.2.1'
    compile 'net.sf.json-lib:json-lib:2.4:jdk15'
    compile 'commons-beanutils:commons-beanutils:1.8.0'
    compile 'commons-lang:commons-lang:2.6'
    compile 'commons-logging:commons-logging:1.1.1'
    compile 'net.sf.ezmorph:ezmorph:1.0.6'

然而,当我尝试运行我的应用程序时,我得到以下内容:

java.lang.IllegalArgumentException: already added:org/apache/commons/collections/ArrayStack;

因此依赖性与我认为的Android Studio提供的库发生冲突。

我试图像这样排除违规文件:

packagingOptions {
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/services/org.apache.commons.collections.ArrayStack'

但这不起作用。

如果我不包含上面的依赖项,在运行时我会收到以下错误:

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/collections/map/ListOrderedMap;`

我正在使用Gradle版本2.2.1和Android插件版本1.2.3运行Android Studio 1.2.1.1

添加了build.gradle的存储库部分:

allprojects {
  repositories {
    maven {
        url 'http://download.crashlytics.com/maven'
        artifactUrls 'http://mvnrepository.com'
    }
    jcenter()
    mavenCentral()
  }
}

apply plugin: 'com.android.application'
apply plugin: 'crashlytics'


android {
compileSdkVersion 'Google Inc.:Google APIs:10'
buildToolsVersion "22.0.1"

repositories {
        maven {
        url 'http://download.crashlytics.com/maven'
        artifactUrls 'http://mvnrepository.com'
    }
}

这是导致运行时错误的代码:

public static String toString(Object o) {
    try {
// the call to JSONObject.fromObject() below causes the runtime error. It is used to detect circular references
        JSONObject.fromObject(o);
        return objectGraphAsString(o, new StringBuffer()).toString();
    } catch (JSONException e) {
        ...
    }
    return "";
}

这是堆栈跟踪:

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/collections/map/ListOrderedMap;
        at net.sf.json.JSONObject.<init>(JSONObject.java:1450)
        at net.sf.json.util.CycleDetectionStrategy.<clinit>(CycleDetectionStrategy.java:37)
        at net.sf.json.JsonConfig.<clinit>(JsonConfig.java:65)
        at net.sf.json.JSONObject.fromObject(JSONObject.java:134)

更新:

我现在正在尝试使用不同的第三方库,在本例中为XStream,我在碰撞依赖中遇到了类似的错误。

我不能成为第一个需要添加这样的依赖的人。 Android构建过程真的破了吗?

1 个答案:

答案 0 :(得分:1)

您是否尝试使用真正的依赖项而不是jar文件?

替换

compile files('libs/json-lib-2.4-jdk15.jar')

通过

compile 'net.sf.json-lib:json-lib:2.4:jdk15'

并对其他lib执行相同的操作:gradle将设法解决递归依赖关系。

修改

您需要排除多个库通用的commons-collections。试试这个

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile('net.sf.json-lib:json-lib:2.4:jdk15') {
        exclude group: 'commons-collections', module: 'commons-collections'
    }
    compile 'commons-beanutils:commons-beanutils:1.8.0'
    compile 'commons-lang:commons-lang:2.6'
    compile 'commons-logging:commons-logging:1.1.1'
    compile 'net.sf.ezmorph:ezmorph:1.0.6'
}