Publication fails with generateMetaData error

Hey guys,

we just switched our project from Gradle 5 to Gradle 7.1.1. With an intermediate step to Gradle 6.
Everything went fine so far, all tests run, and ./gradlew build --warning-mode-all does not contain any warnings or errors. So far so good, but we can not publish anymore.

The publish task fails:

Execution failed for task ':generateMetadataFileForMavenJavaPublication'.
> Cannot publish module metadata where component artifacts are modified.

Our GradleFile looks like that: (Please keep in mind the xxx are just for privacy reasons.)

plugins {
    id "org.sonarqube" version "3.0"
    id "application"
    id "java"
    id "maven-publish"
    id "jacoco"
    id 'net.researchgate.release' version '2.8.1'
    id 'com.palantir.docker' version '0.26.0'
    id "org.owasp.dependencycheck" version "6.0.2"
}

def repoBase = 'http://xxxx-xxxxx.xxxxx-xxxxx.com/content/repositories'
jacoco {
    toolVersion = "0.8.7"
}

assert JavaVersion.current().isJava11(): "Java 11 is required"
sourceCompatibility = JavaVersion.VERSION_11

tasks.withType(JavaCompile).all{
    it.options.compilerArgs+=['--release','11']
}

repositories {
    maven {
        url "${repoBase}/public"
        allowInsecureProtocol = true
    }
}

compileJava.options.encoding = "UTF-8"
compileTestJava.options.encoding = "UTF-8"

/**=====================================================================================================================
 *
 * Configuration for acceptance tests
 *
 =====================================================================================================================*/
configurations {
    remoteTestImplementation { extendsFrom testImplementation }
    remoteTestRuntime { extendsFrom testRuntimeClasspath }
}

sourceSets {
    remoteTest {
        java {
            srcDir 'src/remoteTest/java'
        }
        resources {
            srcDir 'src/remoteTest/resources'
        }
        compileClasspath += sourceSets.main.runtimeClasspath
    }
}

test { testLogging.showStandardStreams = true }

task remoteTest(type: Test) {
    // disable default junit reporting
    reports.junitXml.required = false
    reports.html.required = false

    testClassesDirs = sourceSets.remoteTest.output.getClassesDirs()
    classpath += sourceSets.remoteTest.runtimeClasspath + configurations.remoteTestRuntime + sourceSets.remoteTest.resources

    systemProperty 'xxxx', System.getProperty('xxxx')
    systemProperty 'xxxx', System.getProperty('xxxx')

    systemProperty 'xxxxxx', System.getProperty('xxxxxx')
    systemProperty 'xxxxxx', System.getProperty('xxxxx')

    systemProperty 'xxxxxxx', System.getProperty('xxxxx')
    systemProperty 'xxxxx', System.getProperty('xxxxx')

    outputs.upToDateWhen { false }
}
/**===================================================================================================================*/


/**=====================================================================================================================
 *
 * Dependencies
 *
 =====================================================================================================================*/
configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module('log4j:log4j') with module("org.apache.logging.log4j:log4j-1.2-api:${log4j2Version}")
    }
}

dependencies {
    implementation 'io.netty:netty-all:4.1.16.Final'
    implementation 'org.slf4j:slf4j-api:1.7.25'
    implementation 'javax.xml.bind:jaxb-api:2.3.1'

    // configuration
    implementation "org.apache.commons:commons-configuration2:2.1.1"
    runtimeOnly "commons-beanutils:commons-beanutils:1.9.3"

    // monitoring
    implementation 'xxxx.xxxx.xxxx.xxxxx:xxxx-xxxxxx-xxxxxx-xxxx:4.0.1'
    implementation 'io.dropwizard.metrics:metrics-json:4.1.2'
    implementation 'io.dropwizard.metrics:metrics-servlets:4.1.2'

    // NPM connection
    implementation "xxxx.xxxxx.xxxxx.xxxxx:xxxx-xxxxx-xxxxx:${xxxxx}"

    implementation 'org.apache.commons:commons-lang3:3.3.2'
    implementation 'com.google.code.gson:gson:2.8.7'
    implementation 'org.ehcache:ehcache:3.4.0'
    implementation group: 'com.google.guava', name: 'guava', version: '30.1.1-jre'

    // log4j2 als slf4j backend
    runtimeOnly "org.apache.logging.log4j:log4j-slf4j-impl:${log4j2Version}"
    runtimeOnly "org.apache.logging.log4j:log4j-api:${log4j2Version}"
    runtimeOnly "org.apache.logging.log4j:log4j-core:${log4j2Version}"
    runtimeOnly "org.apache.logging.log4j:log4j-1.2-api:${log4j2Version}"

    testImplementation 'com.github.dreamhead:moco-core:1.0.0'

    testImplementation "org.junit.jupiter:junit-jupiter:${junitVersion}"
    testImplementation("org.junit.vintage:junit-vintage-engine:${junitVersion}") {
        exclude group: 'org.hamcrest', module: 'hamcrest-core'
    }

    testImplementation group: 'org.hamcrest', name: 'hamcrest', version: '2.2'
    testImplementation group: 'org.hamcrest', name: 'hamcrest-library', version: '2.2'
    testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.28.2'

    testImplementation 'commons-io:commons-io:2.8.0'
    testImplementation group: "org.apache.httpcomponents", name: "httpclient", version: "4.5.5", classifier: "tests"
    testImplementation 'nl.jqno.equalsverifier:equalsverifier:2.5.2'
    testImplementation 'com.jayway.jsonpath:json-path:2.4.0'
    testImplementation 'com.github.tomakehurst:wiremock-jre8:2.29.0'
    testImplementation 'org.assertj:assertj-core:3.20.2'
    testImplementation group: 'org.awaitility', name: 'awaitility', version: '4.1.0'

    remoteTestImplementation 'com.jayway.jsonpath:json-path:2.6.0'
    remoteTestImplementation 'org.apache.commons:commons-lang3:3.3.2'
    remoteTestImplementation 'io.cucumber:cucumber-java:6.11.0'
    remoteTestImplementation 'io.cucumber:cucumber-junit:6.11.0'
    remoteTestImplementation 'io.cucumber:cucumber-picocontainer:6.11.0'
    remoteTestImplementation "xxxxx.xxxxx.xxxxxx.xxxxx.xxxxx-xxxx-xxxxx:${Version}"
    remoteTestImplementation("xxxxx.xxxxx.xxxxx.xxxxxx.xxxxx:xxxxx-xxxx-xxx:${Version}") {
        exclude group: 'org.projectlombok', module: 'lombok'
    }
}

rootProject.tasks.named("processRemoteTestResources") {
    duplicatesStrategy = 'include'
}

tasks.withType(Test).configureEach {
    useJUnitPlatform()
}
/**===================================================================================================================*/


/**=====================================================================================================================
 *
 * Configuration for distribution
 *
 =====================================================================================================================*/
mainClassName = "xxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxxx.xxxxxxx"
applicationDefaultJvmArgs = [
        "-Dconfig=../conf/xxxxxxx.xml",
        "-Dlog4j.configurationFile=../conf/log4j2.xml"]

jar {
    doFirst {
        manifest {
            attributes(
                    'Implementation-Title': "xxxxxx xxxxxx",
                    'Implementation-Version': archiveVersion,
                    'Implementation-Timestamp': new Date(),
                    'Build-JDK': System.getProperty('java.version')
            )
        }
    }
}


distributions {
    distTar.enabled = false
    main {
        distributionBaseName = 'xxxxxx.xxxxxx.xxxxxx.xxxxxx'
        contents {
            from {'src/main/resources/xxxxx/xxxxxx/xxxxxx/xxxxxx/xxxxxxx/'} {
                include 'xxxxxxx.xml'
                rename { name -> name.replace('.xml', '-Template.xml') }
                into ("conf/")
            }
        }
    }
}
/**===================================================================================================================*/


/**=====================================================================================================================
 *
 * Configuration for publish task
 *
 =====================================================================================================================*/
artifacts {
    archives distZip
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifact distZip { classifier 'all' }
            from components.java
        }
    }

    repositories {
        maven {
            url = "${repoBase}/snapshots"
            credentials {
                username 'xxxxxx'
                password 'xxxxxx'
            }
        }
    }
}
/**===================================================================================================================*/


/**=====================================================================================================================
 *
 * Configuration for quality analysis
 *
 =====================================================================================================================*/
sonarqube {
    properties {
        property "sonar.host.url", "http://xxxx-sonar"
        property "sonar.projectName", "xxx.xxxx.xxxxx.xxxxx"
    }
}
project.tasks.sonarqube.dependsOn jacocoTestReport

jacocoTestReport {
    reports {
        xml.required = true
    }
}
/**===================================================================================================================*/


/**=====================================================================================================================
 *
 * Configuration for releasing
 *
 =====================================================================================================================*/
release {
    tagTemplate = '$name-$version'
    failOnUnversionedFiles = true
    failOnCommitNeeded = true
}

tasks.create(name: "useMavenReleaseRepository") {
    doLast {
        publishing.repositories.maven.url = "${repoBase}/releases/"
    }
}

task refreshVersion() {
    publishing.publications.mavenJava.version = project.version
    publishing.publications.mavenJava.setArtifacts([distZip])
}
/**===================================================================================================================*/

/**
 * Process dependencies
 */
afterReleaseBuild.dependsOn publish // publishes artefacts to nexus
beforeReleaseBuild.dependsOn(useMavenReleaseRepository)

/**=====================================================================================================================
 *
 * Configuration for docker container
 *
 =====================================================================================================================*/

docker {
    name "xxxxx:${project.version}"
    tag 'xxxx', 'xxxxx/xxxxx/xxxx/xxxxx:xxx'
    files tasks.distZip.outputs
    buildArgs(['PROJECT_VERSION': project.version])
}
project.tasks.dockerfileZip.enabled = false

/**===================================================================================================================
 *
 * Configuration for dependency check
 *
 * =====================================================================================================================*/
dependencyCheck {
    failOnError = false
}

I am fairly new to gradle but I will provide you any information you need.

Thanks!

1 Like