android - Gradle 将 resources.jar 和 aar 上传到 jfrog artifactory。 ArtifactoryPublish会生成两个pom-default.xml,它会随机推送其中一个

标签 android gradle jar artifactory aar

我有一个使用 kotlin 的 Android 项目,它包含一个库模块,我想将此库上传到 jfrog artifactory。我已成功将 aar 文件上传到artifactory。现在我想将library-sources.jar上传到artifactory。但是当我执行gradle任务artifactoryPublish时,它会生成两个pom-default.xml文件,并随机发布其中一个。

项目build.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/"
          }
      }
    }

库 build.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>

ma​​venJava的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)?谢谢。

最佳答案

单个发布包含单个版本的所有 Artifact 。

您定义了两个相同的 Publications(嗯,两者都有 aar 和 pom,只有其中一个有源 JAR),并尝试将它们同时上传到相同的坐标。

  • 不要为每个 aarjarpom 等定义一个 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。 (记住每次都这样做。)

考虑迁移到 Android Gradle Plugin 3.6.0 或更高版本,它本身支持 maven-publish 插件。请参阅 documentation 。这样做有以下好处:

  • 您不必手动将依赖项写入 POM。
  • 每当 AAR 发生更改时,出版物都会自动获取它。 (干净构建后,您无需发布任何内容。您无需在发布之前手动执行assemble。)
  • 在 AGP 中添加对 withSourcesJar() 的支持之前,您仍然需要处理源 JAR。请参阅 issue

在您的情况下,它看起来像这样:

// 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 {
        // ...
    }
}

关于android - Gradle 将 resources.jar 和 aar 上传到 jfrog artifactory。 ArtifactoryPublish会生成两个pom-default.xml,它会随机推送其中一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66622975/

相关文章:

java - CameraView.takePicture() 将捕获的图像字节发送到哪里?

android - ListView 中的视觉指示器显示列表中是否有更多项目

java - 无法启动设备中的 Activity

安卓。将 gradle 从 gradle-4.10.2 升级到 gradle 5.+ 会导致编译时缺少一些依赖项

flutter - gradle构建错误[ fatal error ] checker-qual-2.5.2.pom:2:1:序言中不允许内容

java - 在 Jar 文件中加载图像 java.lang.RuntimeException : Resource not found

java - 在项目中导入jar

android - 如何在 Flutter 中集成 Instagram 登录

java - 将 Lombok 添加到 Intellij 中的 Gradle 项目

java - 通过批处理脚本执行java程序