代码之家  ›  专栏  ›  技术社区  ›  Nicola De Fiorenze

gradle android依赖解析,本地模块与maven lib的区别

  •  1
  • Nicola De Fiorenze  · 技术社区  · 5 年前

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

    1. 打开Android工作室
    2. 我创建了一个新的基本项目。它的主要模块被称为 app .
    3. 我添加了一个库模块,称为 libA .
    4. 利巴 ,我向gson添加了一个依赖项

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

      并添加了一个类 ClassA 使用单一方法 Gson .
    5. 应用程序 ,我将依赖项添加到 利巴 具有

      implementation project(path: ':liba')

      在MainActivity中,我使用了 利巴 ,没有问题。 小精灵 无法从主活动中访问,如预期的那样 .
    6. 我使用 maven-publish 插件

      ./gradlew :liba:publishMsdkPublicationToMavenLocal

    7. 我把进口从上面的换成了

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

      现在我可以继续使用liba中定义的类,没有问题 但我也可以访问gson 在主要活动中我可以
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        Log.d("classA", new Gson().toJson(list));
    

    如何防止GSON暴露在 应用程序 什么时候 liba 在Maven上吗?


    以下是一些消息来源:

    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
    }
    
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   J E Carter II    5 年前

    我自己对最近的变化还不熟悉,但如果我读到 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。