如何使 aar 成为库中的默认工件
How to make aar the default artifact in your library
我需要在公司自己的服务器上发布一个关于 Sonatype 的库。我在以下实现中使用了 maven-publish 插件。
apply plugin: 'maven-publish'
task androidSourcesJar(type: Jar) {
archiveClassifier.set('sources')
if (project.plugins.findPlugin("com.android.library")) {
from android.sourceSets.main.java.srcDirs
from android.sourceSets.main.kotlin.srcDirs
}
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
groupId GROUP_ID
artifactId ARTIFACT_ID
version VERSION_NAME
from components.release
artifact androidSourcesJar
pom {
name = ARTIFACT_ID
description = DESCRIPTION
url = 'library url'
licenses {
license {
name = 'License'
url = 'license url'
}
}
developers {
developer {
id = 'dev id'
name = 'dev name'
email = 'dev mail'
}
}
scm {
connection = 'url.git'
developerConnection = 'url.git'
url = 'url.git'
}
}
}
}
repositories {
maven {
url MAVEN_REPOSITORY_URL
credentials {
username = USER_NAME
password = PASSWORD
}
}
}
}
}
库已成功发布,但是当我使用它时,我必须指定我需要如下aar。
implementation 'com.companyname.android:library-name:1.0.0@aar'
没有aar规范怎么办?像下面这样。
implementation 'com.companyname.android:library-name:1.0.0'
所以Gradle可以找到aar文件并将其添加到外部库。
您必须在您的出版物中将 aar
定义为工件:
artifact("$buildDir/outputs/aar/something-release.aar")
查看 this answer 的简单示例。
我已经解决了。问题不在 pom 中,也不在我打包库的方式中。这是我在 Gradle 中定义它的方式。我曾经用这种方式在根 Gradle 中定义自定义 maven 存储库。
allprojects {
repositories {
google()
mavenCentral()
maven {
url "http://localhost:8081/repository/maven-releases/"
credentials {
username = "username"
password = "password"
}
allowInsecureProtocol(true)
metadataSources{
mavenPom()
}
}
}
}
然而,documentation表示
"从 Gradle 5.3 开始,在解析元数据文件时,无论是 Ivy 还是 Maven,Gradle 都会寻找一个标记,表明存在匹配的 Gradle 模块元数据文件.如果找到,将使用它代替Ivy或Maven文件。
从 Gradle 5.6 开始,您可以通过将 ignoreGradleMetadataRedirection() 添加到 metadataSources 声明来禁用此行为。"
所以我编辑如下。
allprojects {
repositories {
google()
mavenCentral()
maven {
url "http://localhost:8081/repository/maven-releases/"
credentials {
username = "username"
password = "password"
}
allowInsecureProtocol(true)
metadataSources{
mavenPom()
ignoreGradleMetadataRedirection()
}
}
}
}
我需要在公司自己的服务器上发布一个关于 Sonatype 的库。我在以下实现中使用了 maven-publish 插件。
apply plugin: 'maven-publish'
task androidSourcesJar(type: Jar) {
archiveClassifier.set('sources')
if (project.plugins.findPlugin("com.android.library")) {
from android.sourceSets.main.java.srcDirs
from android.sourceSets.main.kotlin.srcDirs
}
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
groupId GROUP_ID
artifactId ARTIFACT_ID
version VERSION_NAME
from components.release
artifact androidSourcesJar
pom {
name = ARTIFACT_ID
description = DESCRIPTION
url = 'library url'
licenses {
license {
name = 'License'
url = 'license url'
}
}
developers {
developer {
id = 'dev id'
name = 'dev name'
email = 'dev mail'
}
}
scm {
connection = 'url.git'
developerConnection = 'url.git'
url = 'url.git'
}
}
}
}
repositories {
maven {
url MAVEN_REPOSITORY_URL
credentials {
username = USER_NAME
password = PASSWORD
}
}
}
}
}
库已成功发布,但是当我使用它时,我必须指定我需要如下aar。
implementation 'com.companyname.android:library-name:1.0.0@aar'
没有aar规范怎么办?像下面这样。
implementation 'com.companyname.android:library-name:1.0.0'
所以Gradle可以找到aar文件并将其添加到外部库。
您必须在您的出版物中将 aar
定义为工件:
artifact("$buildDir/outputs/aar/something-release.aar")
查看 this answer 的简单示例。
我已经解决了。问题不在 pom 中,也不在我打包库的方式中。这是我在 Gradle 中定义它的方式。我曾经用这种方式在根 Gradle 中定义自定义 maven 存储库。
allprojects {
repositories {
google()
mavenCentral()
maven {
url "http://localhost:8081/repository/maven-releases/"
credentials {
username = "username"
password = "password"
}
allowInsecureProtocol(true)
metadataSources{
mavenPom()
}
}
}
}
然而,documentation表示
"从 Gradle 5.3 开始,在解析元数据文件时,无论是 Ivy 还是 Maven,Gradle 都会寻找一个标记,表明存在匹配的 Gradle 模块元数据文件.如果找到,将使用它代替Ivy或Maven文件。
从 Gradle 5.6 开始,您可以通过将 ignoreGradleMetadataRedirection() 添加到 metadataSources 声明来禁用此行为。"
所以我编辑如下。
allprojects {
repositories {
google()
mavenCentral()
maven {
url "http://localhost:8081/repository/maven-releases/"
credentials {
username = "username"
password = "password"
}
allowInsecureProtocol(true)
metadataSources{
mavenPom()
ignoreGradleMetadataRedirection()
}
}
}
}