title | shortTitle | intro | redirect_from | versions | type | topics | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Publishing Java packages with Gradle |
Publish Java packages with Gradle |
You can use Gradle to publish Java packages to a registry as part of your continuous integration (CI) workflow. |
|
|
tutorial |
|
{% data reusables.actions.enterprise-github-hosted-runners %}
{% data reusables.actions.publishing-java-packages-intro %}
We recommend that you have a basic understanding of workflow files and configuration options. For more information, see "AUTOTITLE."
For more information about creating a CI workflow for your Java project with Gradle, see "AUTOTITLE."
You may also find it helpful to have a basic understanding of the following:
The groupId
and artifactId
fields in the MavenPublication
section of the build.gradle file create a unique identifier for your package that registries use to link your package to a registry. This is similar to the groupId
and artifactId
fields of the Maven pom.xml file. For more information, see the "Maven Publish Plugin" in the Gradle documentation.
The build.gradle file also contains configuration for the distribution management repositories that Gradle will publish packages to. Each repository must have a name, a deployment URL, and credentials for authentication.
Each time you create a new release, you can trigger a workflow to publish your package. The workflow in the example below runs when the release
event triggers with type created
. The workflow publishes the package to the Maven Central Repository if CI tests pass. For more information on the release
event, see "AUTOTITLE."
You can define a new Maven repository in the publishing block of your build.gradle file that points to your package repository. For example, if you were deploying to the Maven Central Repository through the OSSRH hosting project, your build.gradle could specify a repository with the name "OSSRH"
.
{% raw %}
plugins {
...
id 'maven-publish'
}
publishing {
...
repositories {
maven {
name = "OSSRH"
url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
credentials {
username = System.getenv("MAVEN_USERNAME")
password = System.getenv("MAVEN_PASSWORD")
}
}
}
}
{% endraw %}
With this configuration, you can create a workflow that publishes your package to the Maven Central Repository by running the gradle publish
command. In the deploy step, you’ll need to set environment variables for the username and password or token that you use to authenticate to the Maven repository. For more information, see "AUTOTITLE."
{% data reusables.actions.actions-not-certified-by-github-comment %}
{% data reusables.actions.actions-use-sha-pinning-comment %}
name: Publish package to the Maven Central Repository
on:
release:
types: [created]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: {% data reusables.actions.action-checkout %}
- name: Set up Java
uses: {% data reusables.actions.action-setup-java %}
with:
java-version: '11'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Publish package
run: ./gradlew publish
env:
MAVEN_USERNAME: {% raw %}${{ secrets.OSSRH_USERNAME }}{% endraw %}
MAVEN_PASSWORD: {% raw %}${{ secrets.OSSRH_TOKEN }}{% endraw %}
{% data reusables.actions.gradle-workflow-steps %}
-
Executes the Gradle
publish
task to publish to theOSSRH
Maven repository. TheMAVEN_USERNAME
environment variable will be set with the contents of yourOSSRH_USERNAME
secret, and theMAVEN_PASSWORD
environment variable will be set with the contents of yourOSSRH_TOKEN
secret.For more information about using secrets in your workflow, see "AUTOTITLE."
Each time you create a new release, you can trigger a workflow to publish your package. The workflow in the example below runs when the release
event triggers with type created
. The workflow publishes the package to {% data variables.product.prodname_registry %} if CI tests pass. For more information on the release
event, see "AUTOTITLE."
You can define a new Maven repository in the publishing block of your build.gradle that points to {% data variables.product.prodname_registry %}. In that repository configuration, you can also take advantage of environment variables set in your CI workflow run. You can use the GITHUB_ACTOR
environment variable as a username, and you can set the GITHUB_TOKEN
environment variable with your GITHUB_TOKEN
secret.
{% data reusables.actions.github-token-permissions %}
For example, if your organization is named "octocat" and your repository is named "hello-world", then the {% data variables.product.prodname_registry %} configuration in build.gradle would look similar to the below example.
{% raw %}
plugins {
...
id 'maven-publish'
}
publishing {
...
repositories {
maven {
name = "GitHubPackages"
url = "https://maven.pkg.github.com/octocat/hello-world"
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}
{% endraw %}
With this configuration, you can create a workflow that publishes your package to {% data variables.product.prodname_registry %} by running the gradle publish
command.
{% data reusables.actions.actions-not-certified-by-github-comment %}
{% data reusables.actions.actions-use-sha-pinning-comment %}
name: Publish package to GitHub Packages
on:
release:
types: [created]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: {% data reusables.actions.action-checkout %}
- uses: {% data reusables.actions.action-setup-java %}
with:
java-version: '11'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Publish package
run: ./gradlew publish
env:
GITHUB_TOKEN: {% raw %}${{ secrets.GITHUB_TOKEN }}{% endraw %}
{% data reusables.actions.gradle-workflow-steps %}
-
Executes the Gradle
publish
task to publish to {% data variables.product.prodname_registry %}. TheGITHUB_TOKEN
environment variable will be set with the content of theGITHUB_TOKEN
secret. Thepermissions
key specifies the access that theGITHUB_TOKEN
secret will allow.For more information about using secrets in your workflow, see "AUTOTITLE."
Publishing packages to the Maven Central Repository and {% data variables.product.prodname_registry %}
You can publish your packages to both the Maven Central Repository and {% data variables.product.prodname_registry %} by configuring each in your build.gradle file.
Ensure your build.gradle file includes a repository for both your {% data variables.product.prodname_dotcom %} repository and your Maven Central Repository provider.
For example, if you deploy to the Central Repository through the OSSRH hosting project, you might want to specify it in a distribution management repository with the name
set to OSSRH
. If you deploy to {% data variables.product.prodname_registry %}, you might want to specify it in a distribution management repository with the name
set to GitHubPackages
.
If your organization is named "octocat" and your repository is named "hello-world", then the configuration in build.gradle would look similar to the below example.
{% raw %}
plugins {
...
id 'maven-publish'
}
publishing {
...
repositories {
maven {
name = "OSSRH"
url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
credentials {
username = System.getenv("MAVEN_USERNAME")
password = System.getenv("MAVEN_PASSWORD")
}
}
maven {
name = "GitHubPackages"
url = "https://maven.pkg.github.com/octocat/hello-world"
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}
{% endraw %}
With this configuration, you can create a workflow that publishes your package to both the Maven Central Repository and {% data variables.product.prodname_registry %} by running the gradle publish
command.
{% data reusables.actions.actions-not-certified-by-github-comment %}
{% data reusables.actions.actions-use-sha-pinning-comment %}
name: Publish package to the Maven Central Repository and GitHub Packages
on:
release:
types: [created]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: {% data reusables.actions.action-checkout %}
- name: Set up Java
uses: {% data reusables.actions.action-setup-java %}
with:
java-version: '11'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Publish package
run: ./gradlew publish
env: {% raw %}
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}{% endraw %}
{% data reusables.actions.gradle-workflow-steps %}
-
Executes the Gradle
publish
task to publish to theOSSRH
Maven repository and {% data variables.product.prodname_registry %}. TheMAVEN_USERNAME
environment variable will be set with the contents of yourOSSRH_USERNAME
secret, and theMAVEN_PASSWORD
environment variable will be set with the contents of yourOSSRH_TOKEN
secret. TheGITHUB_TOKEN
environment variable will be set with the content of theGITHUB_TOKEN
secret. Thepermissions
key specifies the access that theGITHUB_TOKEN
secret will allow.For more information about using secrets in your workflow, see "AUTOTITLE."