我有一个android库项目(称之为my-lib),它使用build.gradle
文件中的这个技巧生成AAR和JAR:
android.libraryVariants.all { variant ->
def name = variant.buildType.name
def task = project.tasks.create "jar${name.capitalize()}", Jar
task.dependsOn variant.javaCompile
task.from variant.javaCompile.destinationDir
artifacts.add('archives', task);
}
此库项目不包含Android资源,并且生成JAR以方便其他一些不使用maven或gradle的系统。 Android应用程序声明它们在gradle文件中依赖于这个安卓库,就像在gradle文件中一样:
dependencies {
compile 'com.mycompany:my-lib:VERSION'
}
但是这些Android应用程序正在拾取JAR文件而不是AAR,从而错过了AAR中的proguard.txt
文件,该文件放在那里使用类似于库gradle文件中的声明:
android {
buildTypes.all {
consumerProguardFiles 'proguard-rules.pro'
}
}
android gradle插件生成的pom文件缺少packaging
条目,它看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>my-lib</artifactId>
<version>VERSION</version>
</project>
packaging
条目应指定aar
,以便其他项目获得AAR而不是JAR,但我该怎么做?也许有一种方法可以生成一个具有不同名称的JAR,因此它不会与AAR冲突?
更新
我无法在所有依赖项中指定@aar
,因为某些依赖项是使用implementation project(':my-lib')
指定项目的库,而gradle不接受@aar
。然后,当我尝试将依赖项添加到应用程序时,我收到此错误:D8: Program type already present
,其名称为my-lib中的类。我确保所有依赖项都是通过implementation
而不是compile
引用my-lib而且我看到在依赖库的中间POM文件中,引用如下所示:
<dependency>
<groupId>mycompany</groupId>
<artifactId>my-lib</artifactId>
<version>1</version>
<scope>runtime</scope>
</dependency>
所以运行时范围似乎是正确的。
我正在使用https://github.com/dcendents/android-maven-gradle-plugin/插件将库发布到我的本地maven缓存中,因此不同git repos中的许多其他Android应用程序都可以访问android库。它出现在我的库build.gradle文件的顶部:
apply plugin: 'com.android.library'
apply plugin: 'android-maven'
group = 'com.mycompany'
version = '1'
repositories {
mavenLocal()
}
答案 0 :(得分:0)
由于Gradle Android Maven插件是对标准Maven插件的修改,根据documentation,你可以试试这个:
uploadArchives {
repositories {
mavenDeployer {
pom.packaging = 'aar'
}
}
}