从版本 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
项目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
我们正在通过 Gitlab Pipeline Jobs 将 Gradle 缓存作为 ZIP 上传到 S3。解压其中一个 ZIP 文件(仅包含该.gradle
文件夹)表明,许多依赖项多次包含完全相同的版本:1x injars-9
和 1x in modules-2
:
为什么会发生这种情况以及如何避免这种情况?因此,我们的 CI 缓存比实际需要的大 20-30%,特别是对于像 Kotlin 编译器这样的大依赖项:
JAR 之间的大小差异可归因于 JAR 文件压缩打开或关闭,它们在内容方面是相同的。
关于文件夹结构的官方解释没有.gradle
帮助。
我在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) 我需要通过Bintray将我的库(多模块项目)上传到sonatype存储库.所以我需要为每个模块单独生成Javadoc.
首先,我遇到了这些类似问题中的问题
Gradle Javadoc失败,出现"错误:包...不存在"
从第一个问题的解决方案,我可以解决我从第三方库(retrofit2,gson)和@NonNull
注释错误使用的类.
但在我的情况下,我的一个模块(Lib2
)依赖于另一个模块(Lib1
).
生成Lib2
模块的Javadoc时,它的警告package does not exist
和cannot 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) 我有两个兄弟项目ProjectA
和ProjectB
那都是下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) 我正在尝试学习如何使用“平台”来对齐多项目设置中项目之间的依赖版本。到目前为止,我已经看到:
我了解如何在项目中声明约束。我想我也了解如何为此目的使用 BOM。但是,我想为此使用一个“强制平台项目”,这里有很多事情我不明白:
总的来说,我没有找到足够的信息来对它的作用或工作方式充满信心。有人可以填写空白或指向一些显示比上述更多示例和详细信息的文档吗?目前我不明白我应该为那个平台项目(它的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