mavengradlejava-11gradle-pluginmaven-publish

Gradle: Invalid publication 'maven': artifact file does not exist


Java 11 and Gradle 7.2 here. I am trying to build a reusable library that I can (eventually) publish to a Maven repository and pull into other projects. But first I just want to get it publishing to my local m2 repo.

The project directory structure looks like:

mylib/
  lib/
    src/
    build.gradle

Where build.gradle is:

plugins {
  id 'java-library'
  id 'maven-publish'
  id 'io.freefair.lombok' version "6.5.0-rc1"
}

sourceCompatibility = 1.11
targetCompatibility = 1.11
archivesBaseName = 'mylib'
version = '1.0.0-RC1'
group = 'org.example'

repositories {
  mavenCentral()
}

dependencies {
  // omitted for brevity
)

testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
}

publishing {
  publications {
      maven(MavenPublication) {
        artifact("build/libs/${archivesBaseName}-${version}.jar") {
        extension 'jar'
      }
    }
  }
}

tasks.named('test') {
  useJUnitPlatform()
}

publishToMavenLocal.configure {
  mustRunAfter build
}

When I run gradle publishToMavenLocal I get:

% ./gradlew clean build publishToMavenLocal

> Task :lib:publishMavenPublicationToMavenLocal FAILED
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':lib:publishMavenPublicationToMavenLocal'.
> Failed to publish publication 'maven' to repository 'mavenLocal'
   > Invalid publication 'maven': artifact file does not exist: '/Users/myuser/workspace/mylib/lib/build/libs/mylib-1.0.0-RC1.jar'

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 833ms
6 actionable tasks: 6 executed

So it looks like even though I'm specifying (on the command line) to run clean then build then publishToMavenLocal, and even though I'm even specifying (in build.gradle) that publishToMavenLocal must run after build, it seems what is happening is:

  1. publishToMavenLocal insists on running first (before clean or build)
  2. Since the JAR hasn't been built yet, no JAR file exists at the location specified ("build/libs/${archivesBaseName}-${version}.jar")
  3. The build fails because the artifact doesn't exist

So I think I just need to get build to run before publishToMavenLocal but I'm out of ideas.


Solution

  • You're mixing the plugins DSL (plugins { }) with legacy plugin application (apply plugin). That's not a big deal, but you should go with @sean's answer and use the plugins DSL instead which will solve your issue.

    To your problem at hand

    Could not get unknown property 'plugin'

    That happens because you missed the : in apply plugin

    apply plugin: 'maven-publish'