How to upload custom metadata with artifact to nexus repository using gradle

We need to store some extra information with artifacts(like git branch name, sha-1 code etc) in nexus repository.

We are using gradle as build tool and wanted to know how can we upload metadata file with artifact into nexus repository using Gradle.

1 Like

If you’re using the maven-publish plugin, here’s an example of publishing an additional artifact:

apply plugin: 'java'
apply plugin: 'maven-publish'

group = 'gradle.forum.test'
version = '5.2'

task createMeta {
    File outFile = new File( buildDir, "${name}/meta.file" )

    outputs.upToDateWhen { false }  // best to replace this with proper inputs if they exist
    outputs.file outFile

    doLast {
        outFile.parentFile.mkdirs()
        outFile.withWriter( 'UTF-8' ) { writer ->
            writer.println 'some meta data'
        }
    }
}

publishing {
    publications {
        main( MavenPublication ) {
            from components.java
            artifact( tasks.createMeta.outputs.files.singleFile ) {
                // configures a https://docs.gradle.org/current/javadoc/org/gradle/api/publish/maven/MavenArtifact.html
                builtBy tasks.createMeta
                classifier 'metadata'
            }
        }
    }
}

https://docs.gradle.org/current/userguide/publishing_maven.html#sec:publishing_custom_artifacts_to_maven

Thank you Chris ! :slight_smile:

Now, I am just curious that how can we attach a metadata file which is already there or created by other source.

If you need to move/rename a file already on the Nexus server to be an artifact of a publication (is that what you mean by “attach”?) then I would take a look at what APIs Nexus provides and then write a task to use those APIs.

No. I want to bundle a metadata file with jar file(project’s outcome) and upload to Nexus repository.

Also I tried your solution above but I see publish task is getting skipped.

Ouput of gradle publish

Task :publish
Skipping task ':publish' as it has no actions.
publish (Thread[Daemon worker Thread 11,5,main]) completed. Took 0.002 secs.
BUILD SUCCESSFUL in 2s
Stopped 0 worker daemon(s).

Ouput of: gradle createMeta

> Task :createMeta
Putting task artifact state for task ':createMeta' into context took 0.0 secs.
Executing task ':createMeta' (up-to-date check took 0.0 secs) due to:
  Task.upToDateWhen is false.

:createMeta (Thread[Daemon worker Thread 12,5,main]) completed. Took 0.011 secs


BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
Stopped 0 worker daemon(s).

If above task is executed successfully, how can I check the metadata.
P.S. I am new to gradle :slight_smile:

My example task should have created <projectdir>/build/createMeta/meta.file.

Sorry, my example did not include any repositories, did you add them?

publishing {
    publications {...}
    repositories {
        maven {
            url 'http://you.nexus.server/repo' // I'm not sure what the Nexus repo URL format is
        }
    }
}

The publishToMavenLocal task should work without any repositories specified. Here’s what I get running my example (I had to add a group and version to my example and fix the mkDirs typo, I updated my original post):

$ ./gradlew pTML
:createMeta
:generatePomFileForMainPublication
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:publishMainPublicationToMavenLocal
:publishToMavenLocal

BUILD SUCCESSFUL

$ cat build/createMeta/meta.file
some meta data

$ ls -l ~/.m2/repository/gradle/forum/test/gradle-forum-test/5.2/
total 12
-rw-rw-r-- 1 cdore cdore 863 Jun 16 12:43 gradle-forum-test-5.2.jar
-rw-rw-r-- 1 cdore cdore  15 Jun 16 12:44 gradle-forum-test-5.2-metadata.file
-rw-rw-r-- 1 cdore cdore 405 Jun 16 12:44 gradle-forum-test-5.2.pom