我已经构建了一个纯 java 库,并编译了两个版本,一个是隐藏的(使用 gradle shadow 插件),一个不是,并将它们部署到我的本地 nexus 存储库。
在我的 Android 库项目中,我创建了两个 productFlavor,standard 和 shadowed,它们引用了我的 nexus 存储库中的相应工件。在 Android Studio 中,只有带有非阴影 jar 的标准产品风味会显示外部库中的库。
切换到任何隐藏的构建变体会导致在 Android Studio 中完全丢失依赖项,并且引用它们中的任何一个的所有代码似乎在 AS 中都被破坏了。(在切换构建变体以更改依赖项时必须同步 gradle)。
添加到阴影编译配置中的其他依赖项(例如 firebase)会显示出来并且工作正常。所以这只是一个依赖。gradle 控制台或事件日志中没有打印任何异常。
但是,命令行中的 gradle 则完全不同。运行 ./gradlew library:dependencies 会适当地显示库及其依赖项,我可以从命令行为所有变体编译和构建我的 AAR,而不会出现问题。当 android 库是我较大项目的子项目时,它起作用了,但是由于我在 Android Studio 中将它分解为一个单独的项目,所以它看起来根本不起作用。
build.gradle 看起来像这样(不包括正常的东西):
android {
publishNonDefault true
productFlavors {
standard {}
shadowed {}
}
}
dependencies {
standardCompile 'groupId:core:1.0.0-SNAPSHOT'
shadowedCompile 'groupId:core-shadowed:1.0.0-SNAPSHOT'
}
FWIW,这是使用:
Android Studio 2.3.3 Build #AI-162.4069837, built on June 6, 2017
JRE: 1.8.0_92-b14 x86_64
JVM: Java HotSpot(TM) 64-Bit Server VM by Oracle Corporation
Gradle Plugin: 2.3.3
Gradle: 3.5
Build Tools: 25.0.3
我真正能够确定两者之间的唯一不同(除了重新定位的包和 pom 中的不同依赖项集)是阴影 jar 的 META-INF 文件夹的内容 - 我想知道这是否可能令人困惑的AS?特别是,影子插件在 MANIFEST.MF 中添加了一个 Class-Path 条目,列出了从 fat jar 中排除的运行时依赖 jar 文件,以及一个 META-INF/maven/ 文件夹,其中包含每个条目的 .pom那些也是。