【问题标题】:Gradle Android dependency resolution, differences between local module and maven libGradle Android依赖解析,本地模块和maven lib的区别
【发布时间】:2019-02-08 15:10:34
【问题描述】:

我做了一个测试项目来验证这个问题。

  1. 打开 Android Studio
  2. 我创建了一个新的基础项目。它的主要模块被称为app
  3. 我添加了一个库模块,名为libA
  4. libA 中,我使用

    implementation 'com.google.code.gson:gson:2.8.5'

    添加了对 Gson 的依赖项,并使用 Gson 使用单个方法添加了单个类 ClassA
  5. app 中,我使用

    implementation project(path: ':liba') 添加了对libA 的依赖项

    在MainActivity 中,我使用了libA 中的类,没有问题。 Gson 无法从主要活动中访问,正如预期的那样
  6. 我使用带有

    ./gradlew :liba:publishMsdkPublicationToMavenLocalmaven-publish 插件将 lib a 发布到 maven 本地

  7. 我已将导入从上述切换到

    implementation "com.ndefiorenze:lib-a:1.0.0"

    现在我可以继续使用 libA 中定义的类而不会出现问题但我也可以访问 Gson 并且在 Main Activity 中我可以做到
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    Log.d("classA", new Gson().toJson(list));

liba 在maven 上时,如何防止Gson 在app 中暴露?


这里有一些来源:

public class ClassA {

    public void fooA(){
        List<String> list = new ArrayList<>();
        list.add("a");
        Log.d("classA", new Gson().toJson(list));
    }
}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ClassA().fooA()
    }
}

liba build.gradle

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

android {
    compileSdkVersion 28

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

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

}

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

    implementation 'com.google.code.gson:gson:2.8.5'
}

publishing {
    publications {
        msdk(MavenPublication) {

            groupId 'com.ndefiorenze'
            artifactId 'lib-a'
            version "1.0.0"
            artifact(bundleReleaseAar)
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.each {
                    if(it.group != null && (it.name != null || "unspecified" == it.name) && it.version != null) {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                    }
                }
            }
        }
    }
    repositories {
        maven {
            url "${System.env.HOME}/.m2/repository"
        }
    }
}

应用程序构建.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.ndefiorenze.dependencyagain"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation project(path: ':liba')
//    implementation "com.ndefiorenze:lib-a:1.0.0"
}

项目 build.gradle:

buildscript {
    ext.kotlin_version = '1.3.20'
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenLocal()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

【问题讨论】:

  • 查看引用类似问题的答案stackoverflow.com/a/54147067/6899896
  • @M.Ricciuti,如果我正确阅读了该答案,那是关于 包括 缺少的依赖项,而不是 排除 一个。如果我理解这个问题,他想将 Gson 的访问权限限制为 liba,而不是在应用程序中看到它。

标签: java android maven gradle


【解决方案1】:

我对自己最近的 gradle 更改不熟悉,但如果我正确阅读 this article,您希望排除传递依赖项,如图所示。

dependencies {
    implementation('log4j:log4j:1.2.15') {
        exclude group: 'javax.jms', module: 'jms'
        exclude group: 'com.sun.jdmk', module: 'jmxtools'
        exclude group: 'com.sun.jmx', module: 'jmxri'
    } }

所以在你的应用构建文件中;

dependencies {
   ...
   implementation project(path: ':liba'){
       exclude group: 'com.google.code.gson', module:'gson'
   }

应该阻止从应用程序访问 Gson。

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2018-10-20
    • 2010-10-22
    • 2019-01-11
    相关资源
    最近更新 更多