android - Gradle 将sources.jar 和aar 上传到jfrog 工件。artifactoryPublish 会生成两个 pom-default.xml,它会随机推送其中一个
问题描述
我有一个带有 kotlin 的 android 项目,它包含一个库模块,我想将此库上传到 jfrog artifactory。我已成功将 aar 文件上传到 artifactory。现在我想将 library-sources.jar 上传到 artifactory。但是当我执行 gradle task artifactoryPublish时,它会生成两个 pom-default.xml 文件,并随机发布其中一个。
项目构建.gradle
buildscript {
ext.kotlin_version = "1.4.30"
repositories {
maven {
url "http://localhost:8081/artifactory/my_virtual_repo/"
}
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.15.2"
}
}
allprojects {
repositories {
maven {
url "http://localhost:8081/artifactory/my_virtual_repo/"
}
}
}
库构建.gradle
......
apply plugin: "com.jfrog.artifactory"
apply plugin: "maven-publish"
def MAVEN_LOCAL_PATH = "http://localhost:8081/artifactory"
def GROUP_ID = "com.xxx.artifactlib"
def ARTIFACT_ID = "artifactlib"
def VERSION_NAME = "1.3"
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
task sourcesJar(type: Jar) {
group = 'jar'
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
artifacts {
archives sourcesJar
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId = GROUP_ID
artifactId = ARTIFACT_ID
version = VERSION_NAME
artifact tasks.sourcesJar
pom.withXml {
def dependencies = asNode().appendNode("dependencies")
configurations.api.allDependencies.each {
def dependency = dependencies.appendNode("dependency")
print(it.group)
dependency.appendNode("groupId", it.group)
dependency.appendNode("artifactId", it.name)
dependency.appendNode("version", it.version)
}
}
}
}
publications {
aar_pub(MavenPublication) {
groupId = GROUP_ID
artifactId = ARTIFACT_ID
version = VERSION_NAME
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
pom.withXml {
def dependencies = asNode().appendNode("dependencies")
configurations.api.allDependencies.each {
def dependency = dependencies.appendNode("dependency")
dependency.appendNode("groupId", it.group)
dependency.appendNode("artifactId", it.name)
dependency.appendNode("version", it.version)
}
}
}
}
}
artifactoryPublish {
contextUrl = MAVEN_LOCAL_PATH
publications("mavenJava", "aar_pub")
clientConfig.publisher.repoKey = "my_local_repo"
clientConfig.publisher.username = "xxx"
clientConfig.publisher.password = "xxx"
}
......
aar_pub 的 pom-default.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx.artifactlib</groupId>
<artifactId>artifactlib</artifactId>
<version>1.3</version>
<packaging>aar</packaging>
<dependencies/>
</project>
mavenJava 的 pom-default.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx.artifactlib</groupId>
<artifactId>artifactlib</artifactId>
<version>1.3</version>
<packaging>pom</packaging>
<dependencies/>
</project>
如何上传给定的 pom 文件(如 aar_pub 的 pom-default)?谢谢你。
解决方案
单个Publication
包含单个版本的所有工件。
您定义了两个相同Publications
的(嗯,都有 aar 和 pom,其中只有一个有源 JAR),并试图同时将它们上传到相同的坐标。
- 不要为, ,
Publication
中的每一个定义一个。aar
jar
pom
- 将所有工件合并为一个
Publication
.
在你的情况下:
publishing {
publications {
mavenJava(MavenPublication) {
groupId = GROUP_ID
artifactId = ARTIFACT_ID
version = VERSION_NAME
artifact tasks.sourcesJar
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
pom.withXml {
def dependencies = asNode().appendNode("dependencies")
configurations.api.allDependencies.each {
def dependency = dependencies.appendNode("dependency")
print(it.group)
dependency.appendNode("groupId", it.group)
dependency.appendNode("artifactId", it.name)
dependency.appendNode("version", it.version)
}
}
}
}
}
artifactoryPublish {
publications("mavenJava")
}
潜在问题
出版物与产生 AAR 的任何任务之间没有正式的关系。您必须assemble
在publish
. (记住每次都这样做。)
考虑迁移到原生支持maven-publish
插件的 Android Gradle Plugin 3.6.0 或更高版本。请参阅文档。这有以下好处:
- 您不必手动将依赖项写入 POM。
- 每当 AAR 更改出版物时,它都会自动获取。(在干净的构建之后您不会发布任何内容。您不必在
assemble
之前手动执行publish
。) - 在将支持
withSourcesJar()
添加到 AGP 之前,您仍然必须处理源 JAR。见问题。
在您的情况下,它看起来像这样:
// Because the components are created only during the afterEvaluate phase, you must
// configure your publications using the afterEvaluate() lifecycle method.
afterEvaluate {
publishing {
publications {
mavenJava(MavenPublication) {
// Applies the component for the release build variant.
from components.release
artifact tasks.sourcesJar
groupId = GROUP_ID
artifactId = ARTIFACT_ID
version = VERSION_NAME
}
}
}
artifactoryPublish {
// ...
}
}
推荐阅读
- python - Django 应用程序使用 virtualenv、wsgi 和 apache 在部署到生产时抛出错误
- qt - 带有 QCustomPlot 的 QT 反锯齿
- regex - 正则表达式避免 Angular 5 开头和结尾的空格
- sql-server - 具有不同源数据库的两台不同服务器的增量负载
- angular5 - Angular 5上传并显示图片
- python - Python - 函数组织和一般最佳实践
- android - 应用程序中检测到 JNI 错误:调用 JNI FindClass 时出现未决异常 java.lang.NoSuchMethodError:没有非静态方法“Lchirpconnect/SDK
- wordpress - 如何在 Wordpress 上的 php 中将 target="_blank" 添加到 URL 中
- sql - 如何在 Laravel 5.6 中编写此 UPDATE SQL 语句?
- java - 记录的通用方法