Gradle 7 和 jitpack.io 在发布期间遇到错误

Gradle 7 and jitpack.io runs into error during publish

当我将 Android 项目升级到 Gradle 7.0 并想在 jitpack.io 中发布 aar 库时,我 运行 进入

Script '/script/maven-plugin.gradle' line: 2

* What went wrong:
A problem occurred evaluating script.
> Failed to apply plugin 'com.github.dcendents.android-maven'.
   > Could not create plugin of type 'AndroidMavenPlugin'.
      > Could not generate a decorated class for type AndroidMavenPlugin.
         > org/gradle/api/publication/maven/internal/MavenPomMetaInfoProvider 

查看完整日志https://jitpack.io/com/github/appdevnext/moka/0.7.1/build.log

Maven插件已在Gradle7.0中淘汰,请改​​用maven-publish插件。

我让它与

一起工作
plugins {
    id 'maven-publish'
    ...
}

task androidSourcesJar(type: Jar) {
    classifier 'sources'
    from android.sourceSets.main.java.srcDirs 
}

project.afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                artifact androidSourcesJar // optional sources
            }
        }
    }
}

你需要一个自己的 jitpack.yml

jdk:
  - openjdk11
install:
  - ./gradlew build :lib:publishToMavenLocal

在这里您可以看到完整的拉取请求 https://github.com/AppDevNext/Moka/pull/77 now it works https://jitpack.io/#AppDevNext/moka/1.0

DSL 版本

    publishing {
      publications {
        val mavenJava by creating(MavenPublication::class) {
            from(components["java"])
        }
    }
}

hannes ach 的答案对我有用。

对于旧的 gradle,还有一个 ...-sources.jar 文件被上传到 jitpack。要恢复该行为,必须稍微增强 gradle 代码段:

project.afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                artifact androidSourcesJar
            }
        }
    }
}

task androidSourcesJar(type: Jar) {
    classifier 'sources'
    from android.sourceSets.main.java.srcDirs 
}

这是一个已知并记录在案的问题:

  • 无法创建 'AndroidMavenPlugin'
  • 类型的插件
  • 无法为类型 AndroidMavenPlugin 生成修饰的 class。
  • org/gradle/api/publication/maven/internal/MavenPomMetaInfoProvider

对于我的情况,我必须声明:

app/module/build.gradle

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                groupId = 'com.github.alkathirikhalid'
                artifactId = 'connection'
                version = 'v1.0.9'
            }
        }
    }
}

和project/build.gradle

plugins {
    id 'maven-publish'
}

参考:

我完成了这 3 个步骤(称为 jitpack,定义 Java ver。,发布 Maven ) 请关注他们!

1- 在build.gradle(Project:...)中添加:

repositories {
        google()
        mavenCentral()
        maven { url "https://jitpack.io" }
    }

然后在buildscript部分,添加:

plugins {
    id 'maven-publish'
}

2-在build.gradle(Module:app)中,在android部分添加:

compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

3- 在build.gradle(Module:module-name)中,在dependencies部分后添加:

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                groupId = 'com.github.yourgitid' //your git id
                artifactId = 'Myket-Intent' //your-repository
                version = '0.1.15' // As same as the Tag
            }
        }
    }
}

以下内容在 Groovy

对我有用
group = [groupId]
version = [version]

task javadoc(type: Javadoc) {
    configurations.implementation.canBeResolved(true)
    configurations.api.canBeResolved(true)

    failOnError false

    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    //destinationDir = file("../javadoc/")
    classpath += configurations.api
}

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    archiveClassifier = "sources"
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives sourcesJar
    archives javadocJar
}

// Because the components are created only during the afterEvaluate phase, you must
// configure your publications using the afterEvaluate() lifecycle method.
afterEvaluate {
    publishing {
        publications {
            // Creates a Maven publication called "release".
            release(MavenPublication) {
                // Applies the component for the release build variant.
                from components.release
                artifact(sourcesJar)

                // You can then customize attributes of the publication as shown below.
                groupId = 'com.github.[name].[repo]'
                artifactId = '[submodule name]'
                version = '[version]'

                pom.withXml {
                    def dependenciesNode = (asNode().get("dependencies") as groovy.util.NodeList).get(0) as groovy.util.Node
                    def configurationNames = ["implementation", "api"]

                    configurationNames.forEach { configurationName ->
                        configurations[configurationName].allDependencies.forEach {
                            if (it.group != null && it.version != "unspecified") {
                                def dependencyNode = dependenciesNode.appendNode("dependency")
                                dependencyNode.appendNode("groupId", it.group)
                                dependencyNode.appendNode("artifactId", it.name)
                                dependencyNode.appendNode("version", it.version)
                                // dependencyNode.appendNode("scope", configurationName)
                            }
                        }
                    }
                }
            }
        }
    }
}

以下在 KTS 对我有用

group = [groupId]
version = [version]

val sourcesJar by tasks.registering(Jar::class) {
    from(android.sourceSets["main"].java.srcDirs)
    archiveClassifier.set("sources")
}

val javadoc by tasks.registering(Javadoc::class) {
    configurations.implementation.get().isCanBeResolved = true
    configurations.api.get().isCanBeResolved = true

    isFailOnError = false
    source = android.sourceSets["main"].java.getSourceFiles()
    classpath += project.files(android.bootClasspath.joinToString(separator = File.pathSeparator))
    classpath += configurations.api
}

// build a jar with javadoc
val javadocJar by tasks.registering(Jar::class) {
    dependsOn(javadoc)
    archiveClassifier.set("javadoc")
    from(javadoc.get().destinationDir)
}

artifacts {
    archives(sourcesJar)
    archives(javadocJar)
}

afterEvaluate {
    publishing {
        publications {
            register("mavenJava", MavenPublication::class) {
                groupId = "com.github.[name].[repo]"
                artifactId = "[submodule name]"
                version = "[version]"

                from(components["release"])
                artifact(sourcesJar.get())

                pom.withXml {
                    val dependenciesNode: groovy.util.Node =
                        (asNode().get("dependencies") as groovy.util.NodeList).get(0) as groovy.util.Node
                    val configurationNames = arrayOf("implementation", "api")

                    configurationNames.forEach { configurationName ->
                        configurations[configurationName].allDependencies.forEach {
                            if (it.group != null && it.version != "unspecified") {
                                val dependencyNode = dependenciesNode.appendNode("dependency")
                                dependencyNode.appendNode("groupId", it.group)
                                dependencyNode.appendNode("artifactId", it.name)
                                dependencyNode.appendNode("version", it.version)
                                // dependencyNode.appendNode("scope", configurationName)
                            }
                        }
                    }
                }
            }
        }
    }
}

请注意,即使使用 withXML 块,api 依赖项的传递依赖项也不会自动添加。我不得不手动添加它们。