How to publish a Java library to a maven repo using gradle - nagypet/articles GitHub Wiki

There is a great article on How to Publish Your Artifacts to Maven Central. The problem with that, it is too complicated to publish your first repo. You don’t want to deal with PGP and Javadoc when you don’t even know what files you need for the repo? But the good news is, it's pretty simple. You can publish your library without any hassle if you have access to a webserver, where you can put some files on. I will show how.

build.gradle

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

... 

publishing {
    repositories {
        maven {
            name = "perit.hu"
            url = uri("http://perit.hu/maven")
        }
    }
    publications {
        maven(MavenPublication) {
            groupId = 'hu.perit.spvitamin'
            artifactId = 'spvitamin-core'
            version = '1.1.0-RELEASE'

            from components.java
        }
    }
}

Now you will have the following tasks:

Publishing tasks
----------------
generateMetadataFileForMavenPublication - Generates the Gradle metadata file for publication 'maven'.
generatePomFileForMavenPublication - Generates the Maven POM file for publication 'maven'.
publish - Publishes all publications produced by this project.
publishAllPublicationsToPerit.huRepository - Publishes all Maven publications produced by this project to the perit.hu repository.
publishMavenPublicationToMavenLocal - Publishes Maven publication 'maven' to the local Maven repository.
publishMavenPublicationToPerit.huRepository - Publishes Maven publication 'maven' to Maven repository 'perit.hu'.
publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.

Try this:

c:\np\github\spvitamin>gradlew publish

> Task :spvitamin-core:publishMavenPublicationToPerit.huRepository FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':spvitamin-core:publishMavenPublicationToPerit.huRepository'.
> Failed to publish publication 'maven' to repository 'perit.hu'
   > Could not PUT 'http://perit.hu/maven/hu/perit/spvitamin/spvitamin-core/1.1.0-RELEASE/spvitamin-core-1.1.0-RELEASE.jar'. Received status code 405 from server: Method Not Allowed

Of course I didn't grant write access to my server, that is why this attempt will fail. But you can generate the very same file structure on your local disk and just copy the whole structure internally to your web server.

c:\np\github\spvitamin>gradlew publishToMavenLocal
Included projects:
  :pwdtool => C:\np\github\spvitamin\pwdtool
  :spvitamin-core => C:\np\github\spvitamin\spvitamin-core
  :spvitamin-spring-admin => C:\np\github\spvitamin\spvitamin-spring-admin
  :spvitamin-spring-cloud-client => C:\np\github\spvitamin\spvitamin-spring-cloud-client
  :spvitamin-spring-cloud-eureka => C:\np\github\spvitamin\spvitamin-spring-cloud-eureka
  :spvitamin-spring-cloud-feign => C:\np\github\spvitamin\spvitamin-spring-cloud-feign
  :spvitamin-spring-cloud-ribbon => C:\np\github\spvitamin\spvitamin-spring-cloud-ribbon
  :spvitamin-spring-cloud-zuul => C:\np\github\spvitamin\spvitamin-spring-cloud-zuul
  :spvitamin-spring-data => C:\np\github\spvitamin\spvitamin-spring-data
  :spvitamin-spring-general => C:\np\github\spvitamin\spvitamin-spring-general
  :spvitamin-spring-logging => C:\np\github\spvitamin\spvitamin-spring-logging
  :spvitamin-spring-security => C:\np\github\spvitamin\spvitamin-spring-security
  :spvitamin-spring-security-authservice => C:\np\github\spvitamin\spvitamin-spring-security-authservice
  :spvitamin-spring-security-keycloak => C:\np\github\spvitamin\spvitamin-spring-security-keycloak
  :spvitamin-spring-security-ldap => C:\np\github\spvitamin\spvitamin-spring-security-ldap
  :spvitamin-spring-server => C:\np\github\spvitamin\spvitamin-spring-server
Dependency check took 4 ms

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.6/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 9s
105 actionable tasks: 45 executed, 60 up-to-date

As a result, the following structure will be created:

c:\Users\NagyPeter\.m2\repository\hu\perit\spvitamin>dir
 Volume in drive C has no label.
 Volume Serial Number is BEA2-3C2D

 Directory of c:\Users\NagyPeter\.m2\repository\hu\perit\spvitamin

2021.05.31  15:49    <DIR>          .
2021.05.31  15:49    <DIR>          ..
2021.05.31  15:05    <DIR>          spvitamin-core
2021.05.31  15:05    <DIR>          spvitamin-spring-admin
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-client
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-eureka
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-feign
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-ribbon
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-zuul
2021.05.31  15:05    <DIR>          spvitamin-spring-data
2021.05.31  15:05    <DIR>          spvitamin-spring-general
2021.05.31  15:05    <DIR>          spvitamin-spring-logging
2021.05.31  15:05    <DIR>          spvitamin-spring-security
2021.05.31  15:05    <DIR>          spvitamin-spring-security-authservice
2021.05.31  15:05    <DIR>          spvitamin-spring-security-keycloak
2021.05.31  15:05    <DIR>          spvitamin-spring-security-ldap
2021.05.31  15:05    <DIR>          spvitamin-spring-server

Now copy this file structure to your web server, and that's it. You can use your library as any other. The only thing you need, you have to specify the URL of your repo in your build.gradle like this:

repositories {
    jcenter()
    mavenCentral()
    maven {
        url "http://perit.hu/maven"
    }
}

dependencies {
    implementation 'hu.perit.spvitamin:spvitamin-core:1.1.0-RELEASE'
    implementation 'hu.perit.spvitamin:spvitamin-spring-server:1.1.0-RELEASE'
}

Dependency management

There is one more great thing. You may refer your dependencies also without a version number. It is more convenient, because you don't need to know the compatible versions.

Just create an xml file with the name spvitamin-dependencies-1.1.0-RELEASE.pom.

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- This module was also published with a richer model, Gradle metadata,  -->
  <!-- which should be used instead. Do not delete the following line which  -->
  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->
  <!-- that they should prefer consuming it instead. -->
  <!-- do_not_remove: published-with-gradle-metadata -->
  <modelVersion>4.0.0</modelVersion>
  <groupId>hu.perit.spvitamin</groupId>
  <artifactId>spvitamin-dependencies</artifactId>
  <version>1.1.0-RELEASE</version>
  <packaging>pom</packaging>
  <name>spvitamin-dependencies</name>
  <properties>
    <spvitamin.version>1.1.0-RELEASE</spvitamin.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-core</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-admin</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-cloud-client</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-cloud-eureka</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-cloud-feign</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-cloud-ribbon</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-cloud-zuul</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-cloud-feign</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-data</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-general</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-logging</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-security</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-security-authservice</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-security-keycloak</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-security-ldap</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>hu.perit.spvitamin</groupId>
        <artifactId>spvitamin-spring-server</artifactId>
        <version>${spvitamin.version}</version>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

Place this into the folder hu\perit\spvitamin\spvitamin-dependencies\1.1.0-RELEASE\.

c:\Users\NagyPeter\.m2\repository\hu\perit\spvitamin>dir
 Volume in drive C has no label.
 Volume Serial Number is BEA2-3C2D

 Directory of c:\Users\NagyPeter\.m2\repository\hu\perit\spvitamin

2021.05.31  15:49    <DIR>          .
2021.05.31  15:49    <DIR>          ..
2021.05.31  15:05    <DIR>          spvitamin-core
2021.05.31  15:49    <DIR>          spvitamin-dependencies <== HERE!
2021.05.31  15:05    <DIR>          spvitamin-spring-admin
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-client
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-eureka
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-feign
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-ribbon
2021.05.31  15:05    <DIR>          spvitamin-spring-cloud-zuul
2021.05.31  15:05    <DIR>          spvitamin-spring-data
2021.05.31  15:05    <DIR>          spvitamin-spring-general
2021.05.31  15:05    <DIR>          spvitamin-spring-logging
2021.05.31  15:05    <DIR>          spvitamin-spring-security
2021.05.31  15:05    <DIR>          spvitamin-spring-security-authservice
2021.05.31  15:05    <DIR>          spvitamin-spring-security-keycloak
2021.05.31  15:05    <DIR>          spvitamin-spring-security-ldap
2021.05.31  15:05    <DIR>          spvitamin-spring-server

Now copy this one to your web server too. After it, you can modify your build gradle like this:

ext {
    set('spvitaminVersion', '1.1.0-RELEASE')
}

dependencies {
    implementation 'hu.perit.spvitamin:spvitamin-core'
    implementation 'hu.perit.spvitamin:spvitamin-spring-server'
}

dependencyManagement {
    imports {
        mavenBom "hu.perit.spvitamin:spvitamin-dependencies:${spvitaminVersion}"
    }
}

That's pretty much it.

⚠️ **GitHub.com Fallback** ⚠️