Publishing to Maven Central

Publish your public-facing Fern Java SDK to the Maven Central registry. After following the steps on this page, you’ll have a versioned package published on Maven Central.

This page assumes that you have:

Configure Maven Central publication

You’ll need to update your generators.yml file to configure the output location, target repository, and publishing mode. Your generators.yml should live in your source repository (or on your local machine), not the repository that contains your Java SDK code.

1

Configure output location

In the group for your Java SDK, change the output location in generators.yml from local-file-system (the default) to maven to indicate that Fern should publish your package directly to the Maven Central registry.

Then, add publish-to: central to indicate that the publish target is the new Maven Central Portal (Sonatype). To publish to the legacy Nexus Repository, use publish-to: ossrh.

generators.yml
1groups:
2 java-sdk:
3 generators:
4 - name: fernapi/fern-java-sdk
5 version: 3.5.3
6 output:
7 location: maven
8 config:
9 publish-to: central
2

Add repository location

Add the path to the GitHub repository containing your Java SDK:

generators.yml
1groups:
2 java-sdk:
3 generators:
4 - name: fernapi/fern-java-sdk
5 version: 3.5.3
6 output:
7 location: maven
8 config:
9 publish-to: central
10 github:
11 repository: your-org/company-java
3

Choose your publishing mode

Optionally set the mode to control how Fern handles SDK publishing:

  • mode: release (default): Fern generates code, commits to main, and tags a release automatically
  • mode: pull-request: Fern generates code and creates a PR for you to review before release
  • mode: push: Fern generates code and pushes to a branch you specify for you to review before release

You can also configure other settings, like the reviewers or license. Refer to the full github (generators.yml) reference for more information.

generators.yml
1groups:
2 java-sdk:
3 generators:
4 - name: fernapi/fern-java-sdk
5 version: 3.5.3
6 output:
7 location: maven
8 config:
9 publish-to: central
10 github:
11 repository: your-org/company-java
12 mode: push
13 branch: your-branch-name # Required for mode: push

Set up Maven Central publishing authentication

1

Log into Maven Central

Log into Maven Central or create a new account.

2

Verify your namespace

  1. Click on your username, then select View Namespaces. Click Register New Namespace.
  2. Enter your company website or GitHub account in reverse domain name format and go through the verification process.
3

Configure Maven Coordinate

Add the namespace you just verified in Maven Central to the coordinate field. This specifies how your Java SDK will be published and referenced in the Maven Central respository.

generators.yml
1groups:
2 java-sdk:
3 generators:
4 - name: fernapi/fern-java-sdk
5 version: 3.5.3
6 output:
7 location: maven
8 coordinate: com.company:sdk-name # groupId:artifactId
9 config:
10 publish-to: central
11 github:
12 repository: your-org/company-java
4

Generate user tokens

  1. Back in Maven Central, click on your username, then select View Account

  2. Click on Generate User Token, then click Ok to confirm generation. This will invalidate any existing token.

    Save your username and password tokens – they won’t be displayed after you leave the page.
5

Configure Maven Central authentication token

Add username: ${MAVEN_USERNAME} and password: ${MAVEN_PASSWORD} to generators.yml to tell Fern to use the MAVEN_USERNAME and MAVEN_PASSWORD environment variable for authentication when publishing to the Maven Central registry.

generators.yml
1groups:
2 java-sdk:
3 generators:
4 - name: fernapi/fern-java-sdk
5 version: 3.5.3
6 output:
7 location: maven
8 coordinate: com.company:sdk-name
9 username: ${MAVEN_USERNAME}
10 password: ${MAVEN_PASSWORD}
11 config:
12 publish-to: central
13 github:
14 repository: your-org/company-java

Generate GPG Signature

Next, set up code signing credentials by generating or identifying a GPG key ID, password, and secret key. Maven Central requires all artifacts to be digitally signed with PGP/GPG keys.

If you don’t have gpg installed, you can download the binary from https://gnupg.org/download/index.html, or install it via package manager.
1

Find your key

If you already have a GPG key, you can list your keys:

1gpg --list-secret-keys --keyid-format LONG

If you don’t have a GPG key, you can generate a new one:

1gpg --gen-key

You’ll be prompted to create a new username and passphrase.

2

Export your key

Export your key so you can store it in an environment variable later on:

1gpg --export-secret-keys --armor YOUR_KEY_ID

Be sure to replace YOUR_KEY_ID with the key ID of the key you want to export.

More information is available on Maven Central’s GPG validation page.
3

Configure GPG Signature

Add the keyId, password, and secretKey from the previous step to generators.yml:

generators.yml
1groups:
2 java-sdk:
3 generators:
4 - name: fernapi/fern-java-sdk
5 version: 3.5.3
6 output:
7 location: maven
8 coordinate: com.company:sdk-name
9 username: ${MAVEN_USERNAME}
10 password: ${MAVEN_PASSWORD}
11 signature:
12 keyId: ${MAVEN_SIGNATURE_SECRET_KEY_ID}
13 password: ${MAVEN_SIGNATURE_PASSWORD}
14 secretKey: ${MAVEN_SIGNATURE_SECRET_KEY}
15 config:
16 publish-to: central
17 github:
18 repository: your-org/company-java
4

Upload your key to public key servers

Finally, upload your key to public key servers so Maven Central can access the signature:

$# Upload to multiple key servers
>gpg --keyserver keyserver.ubuntu.com --send-keys YOUR_KEY_ID
>gpg --keyserver keys.openpgp.org --send-keys YOUR_KEY_ID
>gpg --keyserver pgp.mit.edu --send-keys YOUR_KEY_ID

Publish your SDK

Decide how you want to publish your SDK to Maven Central. You can use GitHub workflows for automated releases or publish directly via the CLI.

Set up a release workflow via GitHub Actions so you can trigger new SDK releases directly from your source repository.

1

Set up authentication

Open your source repository in GitHub. Click on the Settings tab. Then, under the Security section, open Secrets and variables > Actions.

You can also use the url https://github.com/<your-repo>/settings/secrets/actions.

2

Add secret for your Fern Token

  1. Select New repository secret.
  2. Name your secret FERN_TOKEN.
  3. Add your Fern token. If you don’t already have one, generate one by running fern token. By default, the fern_token is generated for the organization listed in fern.config.json.
  4. Click Add secret.
3

Add secrets for Maven Central

Add the following repository secrets by selecting New repository secret for each:

  1. MAVEN_USERNAME - Your Maven Central username
  2. MAVEN_PASSWORD - Your Maven Central password
  3. MAVEN_SIGNATURE_SECRET_KEY_ID - Your GPG key ID
  4. MAVEN_SIGNATURE_PASSWORD - Your GPG passphrase
  5. MAVEN_SIGNATURE_SECRET_KEY - Your GPG secret key
4

Set up a new workflow

Set up a CI workflow that you can manually trigger from the GitHub UI. In your repository, navigate to Actions. Select New workflow, then Set up workflow yourself. Add a workflow that’s similar to this:

.github/workflows/publish.yml
1name: Publish Java SDK
2
3on:
4 workflow_dispatch:
5 inputs:
6 version:
7 description: "The version of the Java SDK that you would like to release"
8 required: true
9 type: string
10
11jobs:
12 release:
13 runs-on: ubuntu-latest
14 steps:
15 - name: Checkout repo
16 uses: actions/checkout@v4
17
18 - name: Install Fern CLI
19 run: npm install -g fern-api
20
21 - name: Release Java SDK
22 env:
23 FERN_TOKEN: ${{ secrets.FERN_TOKEN }}
24 MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
25 MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
26 MAVEN_SIGNATURE_SECRET_KEY_ID: ${{ secrets.MAVEN_SIGNATURE_SECRET_KEY_ID }}
27 MAVEN_SIGNATURE_PASSWORD: ${{ secrets.MAVEN_SIGNATURE_PASSWORD }}
28 MAVEN_SIGNATURE_SECRET_KEY: ${{ secrets.MAVEN_SIGNATURE_SECRET_KEY }}
29 run: |
30 fern generate --group java-sdk --version ${{ inputs.version }} --log-level debug

You can alternatively configure your workflow to execute on: [push].

5

Regenerate and release your SDK

Navigate to the Actions tab, select the workflow you just created, specify a version number, and click Run workflow. This regenerates your SDK.

The rest of the release process depends on your chosen mode:

  • Release mode (default): If you didn’t specify a mode or set mode: release, no further action is required. Fern automatically tags the new release with your specified version number and initiates the publishing workflow in your SDK repository.

  • Pull request or push mode: If you set mode: pull-request or mode: push, Fern creates a pull request or pushes to a branch respectively. Review and merge the PR (pull-request) or branch (push), then tag a new release to initiate the publishing workflow in your SDK repository.

Once the workflow completes, you can view your new release by logging into Maven Central and navigating to View Deployments.

1

Set Maven environment variables

Set the Maven Central environment variables on your local machine:

$export MAVEN_USERNAME=your-maven-username
>export MAVEN_PASSWORD=your-maven-password
>export MAVEN_SIGNATURE_SECRET_KEY_ID=your-gpg-key-id
>export MAVEN_SIGNATURE_PASSWORD=your-gpg-passphrase
>export MAVEN_SIGNATURE_SECRET_KEY=your-gpg-secret-key
2

Regenerate and release your SDK

Regenerate your SDK, specifying the version:

$fern generate --group java-sdk --version <version>

The rest of the release process depends on your chosen mode:

  • Release mode (default): If you didn’t specify a mode or set mode: release, no further action is required. Fern automatically tags the new release with your specified version number and initiates the publishing workflow in your SDK repository.

  • Pull request or push mode: If you set mode: pull-request or mode: push, Fern creates a pull request or pushes to a branch respectively. Review and merge the PR (pull-request) or branch (push), then tag a new release to initiate the publishing workflow in your SDK repository.

Once the command completes, you can view your new release by logging into Maven Central and navigating to View Deployments.