标签: gradle-dependencies

如何导出android库中的依赖项

从版本 3.0.0 开始,Android Gradle 插件允许您将模块的依赖项导出到其他模块。

因此,在我的 android 库模块中,我应该能够使用该依赖项来声明api <dependency declaration>依赖项,并将该依赖项作为导出的传递依赖项访问,在我的主应用程序项目中,我已将我的库模块声明为依赖项。

我还使用静态文件依赖项。

举个例子:

我有一个类NeededEverywhere,它是在它自己的 gradle 模块中定义的everywhere-module。该模块与我的库模块位于同一项目中。

//library module's build.gradle:
dependencies {
    api project(':everywhere-module')
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的 build.gradle(位于不同的 Android Studio 项目中)中,我声明了对库的依赖,但不是everywhere-module. 这应该意味着这everywhere-module是一个导出的传递依赖。

//app project's build.gradle
dependencies {
    implementation files("path/to/my/library/file.aar")
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法访问NeededEverywhere我的应用程序中的课程。

我究竟做错了什么?

android gradle transitive-dependency android-studio gradle-dependencies

5
推荐指数
1
解决办法
2659
查看次数

使用 android.tools.lint 执行 JetifyTransform 失败

项目build.gradle

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

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

gradle 包装器:

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
Run Code Online (Sandbox Code Playgroud)

库模块build.gradle依赖关系:

dependencies {
    compileOnly "com.android.tools.lint:lint-api:26.6.3"
//    compileOnly "com.android.tools.lint:lint-checks:26.6.3"
    testImplementation "com.android.tools.lint:lint-tests:26.6.3"
}
Run Code Online (Sandbox Code Playgroud)

如果我跑gradle assemble

任务“:lint-rules:compileDebugKotlin”执行失败。

无法解析配置“:lint-rules:debugCompileClasspath”的所有工件。无法转换工件“common.jar (com.android.tools:common:26.6.3)”以匹配属性 {artifactType=android-classes, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime} 。JetifyTransform 执行失败:/Users/.../.gradle/caches/modules-2/files-2.1/com.android.tools/common/26.6.3/660d537bd70cc816f63b4b038a529177f402448a/common-26.6.3.jar。无法使用 Jetifier 转换“/Users/.../.gradle/caches/modules-2/files-2.1/com.android.tools/common/26.6.3/660d537bd70cc816f63b4b038a529177f402448a/common-26.6.3.jar”。原因:给定的工件包含一个带有包引用“android.support.design.widget”的字符串文字,无法安全地重写。使用反射的库(例如注释处理器)需要手动更新以添加对 androidx 的支持。(使用 --stacktrace 运行以获取更多详细信息。)

如果我取消注释lint-checks导入,它会添加:

无法转换'/Users/.../.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-checks/26.6.3/aa1f7a4caa8cbc70f85e4c97409270ce7d7a7eab/lint-checks-26.6.3。 jar' 使用 Jetifier。原因:重复条目:注意。(使用 --stacktrace 运行以获取更多详细信息。)

我尝试过禁用 Jetifier,但这是最糟糕的。我尝试从 lint 中排除 tools:common 并手动导入,但它也不起作用。

我被困在这里,我错过了什么?

android gradle android-lint android-gradle-plugin gradle-dependencies

5
推荐指数
1
解决办法
9945
查看次数

为什么Gradle缓存多次包含依赖项?

我们正在通过 Gitlab Pipeline Jobs 将 Gradle 缓存作为 ZIP 上传到 S3。解压其中一个 ZIP 文件(仅包含该.gradle文件夹)表明,许多依赖项多次包含完全相同的版本:1x injars-9和 1x in modules-2在此输入图像描述

为什么会发生这种情况以及如何避免这种情况?因此,我们的 CI 缓存比实际需要的大 20-30%,特别是对于像 Kotlin 编译器这样的大依赖项: 在此输入图像描述

JAR 之间的大小差异可归因于 JAR 文件压缩打开或关闭,它们在内容方面是相同的。

关于文件夹结构的官方解释没有.gradle帮助。

gradle gradle-dependencies

5
推荐指数
1
解决办法
392
查看次数

使用RxJava 2和Retrofit 2,适配器版本问题

我在Android Studio中为现有的应用程序模块添加了一个新的库模块.主要的区别是添加了RxJava 2和Retrofit 2.更新了new模块的build.gradle后,我开始得到下一个错误:

错误:任务':app:transformResourcesWithMergeJavaResForBetaNewApiDebug'的执行失败.com.android.build.api.transform.TransformException:com.android.builder.packaging.DuplicateFileException:在APK META-INF/rxjava.properties中复制的重复文件File1:C:\ Users\Gaket.gradle\_caches\modules-2\files-2.1\io.reactivex.rxjava2\rxjava\2.0.2\cfccdd18cdfbe7b4773d42c9f3512eeafbe5cbf9\rxjava-2.0.2.jar File2:C:\ Users\Gaket.gradle\_caches\modules-2\files-2.1\io.reactivex\rxjava\1.1.5\ece7b5d0870e66d8226dab6dcf47a2b12afff061\rxjava-1.1.5.jar

我看到RxJava存在一些问题(我想尝试RxJava 2,在这里我看到RxJava 1和RxJava 2).在添加所有依赖项后立即出现问题,我们不在RxJava主应用程序中使用.

更新: 正如我在下面提到的,我检查了三个主题(您可以在下面看到).这个问题:可能的重复类似于我在下面提到的那个: 这一个.他们两个都有解决方法,没有考虑我在答案中强调的真正问题.而答案是 "没有的生产就绪适配器从改造2至RxJava 2的时刻"(以下答案中描述的全部细节).

我检查了几个主题:首先 是一个具体问题的具体解决方案,第二个谈论rxbindings,但我不使用它们,其他一些也没有解决我的问题或看起来像这个完全解决方法.我试图谷歌"rxjava 2和改造2"但没有找到解决方案.

这是build.gradle图书馆:

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

android {
compileSdkVersion 25
buildToolsVersion "25.0.0"

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"

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

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



dependencies {
compile fileTree(dir: 'libs', include: …
Run Code Online (Sandbox Code Playgroud)

android retrofit2 gradle-dependencies rx-java2

4
推荐指数
1
解决办法
5735
查看次数

在android studio中创建dependency.gradle

我如何dependencies.gradle在 android studio 中创建如下所示:

在此输入图像描述

和:

在此输入图像描述

android gradle android-studio gradle-dependencies

4
推荐指数
1
解决办法
2062
查看次数

多模块项目中的Javadoc生成"错误包不存在"

我需要通过Bintray将我的库(多模块项目)上传到sonatype存储库.所以我需要为每个模块单独生成Javadoc.

首先,我遇到了这些类似问题中的问题

Android Studio Javadoc:找不到符号

Gradle Javadoc失败,出现"错误:包...不存在"

从第一个问题的解决方案,我可以解决我从第三方库(retrofit2,gson)和@NonNull注释错误使用的类.

但在我的情况下,我的一个模块(Lib2)依赖于另一个模块(Lib1).

生成Lib2模块的Javadoc时,它的警告package does not existcannot find symbol另一个模块的类(Lib1).

并且这两个模块都报告package does not exist了android支持和设计库的错误.

每一个import <packagename>.R;报道cannot find symbol

我的Javadoc生成任务

task androidJavadocs(type: Javadoc) {
      source = android.sourceSets.main.java.source
      classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
      ext.androidJar ="${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
      classpath += files(ext.androidJar)
      project.android.libraryVariants.all { variant ->
        classpath += files(variant.javaCompile.classpath.files)
      }
}
Run Code Online (Sandbox Code Playgroud)

Lib1中的依赖项 build.gradle

compile rootProject.appcompat
compile rootProject.design
compile rootProject.retrofit2
compile rootProject.support
compile …
Run Code Online (Sandbox Code Playgroud)

android javadoc gradle-dependencies

3
推荐指数
1
解决办法
2857
查看次数

如何从 gradle 项目依赖项中排除 META-INF?

我有两个兄弟项目ProjectAProjectB那都是下Parent。Parent 基本上只是一个文件夹,并且对于两个子项目都有共同的 build.gradle 设置。

ProjectB 在编译时依赖于 ProjectA 中的代码,但 ProjectA 是单独构建的,并包含一个 META-INF 目录。构建 ProjectB 时,我收到一个java.lang.SecurityException: Invalid signature file digest for Manifest main attributes。正如您在下面看到的,我已从 ProjectB 中删除了 zipTree 调用,但不确定如何解决此问题。非常感谢一些帮助。

请记住,两个项目都必须构建自己的 JAR,而 ProjectA 必须遮蔽下面看到的两个依赖项。

父设置.gradle:

rootProject.name = "Parent"
include ":ProjectA", ":ProjectB"
Run Code Online (Sandbox Code Playgroud)

父 build.gradle:

allprojects {
    buildscript {
        repositories {
            jcenter()
            maven {
                name = "forge"
                url = "https://files.minecraftforge.net/maven"
            }
            maven {
                name = "sponge"
                url = "https://repo.spongepowered.org/maven"
            }
        }
        dependencies {
            classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT"
            classpath "org.spongepowered:mixingradle:0.6-SNAPSHOT"
        } …
Run Code Online (Sandbox Code Playgroud)

java gradle gradle-dependencies spongeapi

1
推荐指数
1
解决办法
1980
查看次数

如何使用 Gradle“平台”在多项目设置中对齐依赖版本?

我正在尝试学习如何使用“平台”来对齐多项目设置中项目之间的依赖版本。到目前为止,我已经看到:

  1. https://docs.gradle.org/6.2.1/userguide/platforms.html
  2. https://docs.gradle.org/6.2.1/userguide/dependency_management_terminology.html#sub::terminology_platform
  3. https://docs.gradle.org/6.2.1/userguide/dependency_version_alignment.html#sec:virtual_platform
  4. https://docs.gradle.org/6.2.1/userguide/dependency_constraints.html#sec:adding-constraints-transitive-deps
  5. https://docs.gradle.org/6.2.1/userguide/java_platform_plugin.html
  6. ……以及更多试图寻找示例的外部站点,例如 https://dzone.com/articles/gradle-goodness-use-bill-of-materials-bom-as-depen

我了解如何在项目中声明约束。我想我也了解如何为此目的使用 BOM。但是,我想为此使用一个“强制平台项目”,这里有很多事情我不明白:

  1. 我是否必须使用“java 平台”插件?我们有非 Java 项目。我们的配置不太适合“api”和“runtime”桶。
  2. 即使我们都是 Java,对于任何一个项目,我们也不能为其“api”和“运行时”提供单独的版本。虽然我确实了解这在某些情况下可能提供的控制级别,但我不明白这些是如何协同工作的,以确保项目获得指定的依赖项。
  3. Gradle 如何知道在使用平台的项目和平台规范之间匹配哪些配置的约束?我想我看到了平台中定义“api”和其他约束的示例,我“理解”项目将通过声明 api platform(project(':platform')) 来引用它。我希望 Gradle 不会试图通过简单的名称匹配来将“api”与“api”匹配。我需要多个不同的依赖配置,无论它被称为什么,都与同一个平台“配置”对齐。

总的来说,我没有找到足够的信息来对它的作用或工作方式充满信心。有人可以填写空白或指向一些显示比上述更多示例和详细信息的文档吗?目前我不明白我应该为那个平台项目(它的build.gradle)实际写什么和/或我将如何从我们拥有的当前项目中正确引用它。

谢谢!

更新 1:在https://discuss.gradle.org/t/can-someone-tell-me-what-i-am-doing-wrong-to- 上发布了一个最小的实验来测试我(缺乏)对此的理解align-dependency-versions-across-projects/35601 ...

gradle gradle-dependencies gradle-multi-project-build gradle-groovy-dsl

1
推荐指数
1
解决办法
2024
查看次数