4

我编写了一个使用org.json来自 json.org 的 (A) 的库,假设 Android 使用了相同的库(在 android 中它也称为org.json(B),只是它缺少一些相对关键的功能)。现在我想做的是设置我的 gradle,以便我的项目使用org.json(A) 而不是org.json(B)。我尝试将以下内容添加到我的 app.gradle:

android {
    blabla
    defaultConfig {
        blabla
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets{
        main{
            java{
                exclude 'org/json/**'
            }
        }
    }

}

但是,这似乎不起作用。我仍然可以使用 Android org.json(B),并且在键入new JSONObject()时仍然使用 Android 的实现。我该如何解决这个问题?

4

2 回答 2

3

您可以将org.json依赖项重新定位到另一个包名称。这可以通过 gradle shadow 插件来完成。

插件项目:https
://github.com/johnrengelman/shadow 插件文档:https ://imperceptiblethoughts.com/shadow/

我的工作示例:
提示:我在我的 Android 项目中使用了一个 java 库项目“lib”,它依赖于org.json.

lib/build.gradle

apply plugin: 'java-library'
apply plugin: 'com.github.johnrengelman.shadow'

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.3'
    }
}

shadowJar {
    relocate 'org.json', 'shadow.org.json'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation('org.json:json:20180813')
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

应用程序/build.gradle

apply plugin: 'com.android.application'

android {
    [..]
}

dependencies {
    [..]
    implementation project(path: ':lib', configuration: 'shadow')
}
于 2018-12-31T10:14:28.907 回答
2

我该如何解决这个问题?

将您的从 更改org.jsonorg.something.else。您不能用应用程序中的软件包替换系统提供的软件包,即使是您自己的进程也是如此。您不控制运行时类路径,固件总是胜出。

或者,org.json换成表现更好的东西,比如 Gson 或 Jackson。

于 2015-11-19T13:01:50.397 回答