无法在build.gradle的发布块中定义任何内容

时间:2019-05-22 02:20:40

标签: maven gradle intellij-idea groovy

我正在尝试创建一个库并将其发布到本地Maven。当我开始尝试向MavenPublication添加publications时,IDE会给它加上一个虚线下划线,就像它是一个未解决的引用一样。与fromartifact之类的参数相同。

如果我取消注释pom块,则gradle同步失败并显示Cause: invalid type code: B3,最终是因为其中的一个参数上的org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException

IntelliJ Idea screen shot

这个build.gradle文件在我的模块之一中。顶层build.gradle非常简单。

buildscript {

    repositories {
        mavenLocal()
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        jcenter()
    }
    dependencies {

    }
}

allprojects {
    apply plugin: "idea"

    group = 'com.mygroup'
    version = '1.0.0'

    repositories {
        mavenLocal()
        mavenCentral()
        jcenter()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://oss.sonatype.org/content/repositories/releases/" }
    }
}

这是模块的build.gradle。

plugins {
    id 'java-library'
    id 'maven-publish'
    id 'signing'
}

task sourcesJar(type: Jar) {
    from sourceSets.main.allJava
    archiveClassifier = 'sources'
}

task javadocJar(type: Jar) {
    from javadoc
    archiveClassifier = 'javadoc'
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId = 'mylibrary'
            from components.java
            artifact sourcesJar
            artifact javadocJar
            pom {
                name = 'MyLibrary'
                organization {
                    name 'MyOrg'
                    url 'www.myurl.com'
                }
            }
        }
    }
}

signing {
    sign publishing.publications.mavenJava
}

javadoc {
    if(JavaVersion.current().isJava9Compatible()) {
        options.addBooleanOption('html5', true)
    }
}

我正在使用Gradle 5.1.1,IntelliJ Idea 2019.1.2和JDK 12.0.1。

1 个答案:

答案 0 :(得分:1)

由于它的解释有点长,所以让我澄清一下这里的情况,而不是在评论中回答我的问题,即提供带有pom-offer块的完整示例。正如OP已经弄清楚的那样,问题出在丢失的=符号中。 pom.organization是必需的,并且不能出现在plugin.id中。

对于plugins块,这是一个众所周知的Groovy convention of method call,它允许我们省略括号。而且您不能在此处使用赋值,因为id不是类的属性。查看plugins block的Gradle源代码。

但是,如果我们查看pom.organization block,我们会看到Action的接收者是MavenPomOrganization,其中getName()getUrl()返回Property<String>并且不接受任何争论。从Groovy的立场来看,绝对不是省略括号的情况。但是我不确定分配语法(name = 'MyOrg')在这里是如何工作的。乍一看,我可以推测这是使用Groovy魔术的某种Gradle魔术,例如AST转换之类的东西