2022-09-09 08:49:09 -04:00
# Setup Java
2019-07-16 13:28:00 -04:00
2022-09-09 08:49:09 -04:00
[![Main workflow ](https://github.com/actions/setup-java/actions/workflows/workflow.yml/badge.svg )](https://github.com/actions/setup-java/actions/workflows/workflow.yml)
2019-08-12 15:12:48 -04:00
2022-09-09 08:49:09 -04:00
The `setup-java` action provides the following functionality for GitHub Actions runners:
2021-04-05 06:02:27 -04:00
- Downloading and setting up a requested version of Java. See [Usage ](#Usage ) for a list of supported distributions
- Extracting and caching custom version of Java from a local file
- Configuring runner for publishing using Apache Maven
- Configuring runner for publishing using Gradle
- Configuring runner for using GPG private key
- Registering problem matchers for error output
2021-08-19 13:19:35 -04:00
- Caching dependencies managed by Apache Maven
- Caching dependencies managed by Gradle
2022-07-07 03:29:35 -04:00
- Caching dependencies managed by sbt
2022-01-16 11:33:29 -05:00
- [Maven Toolchains declaration ](https://maven.apache.org/guides/mini/guide-using-toolchains.html ) for specified JDK versions
2022-07-07 03:29:35 -04:00
This action allows you to work with Java and Scala projects.
2021-04-05 06:02:27 -04:00
## V2 vs V1
2022-09-09 08:49:09 -04:00
- V2 supports custom distributions and provides support for Azul Zulu OpenJDK, Eclipse Temurin and AdoptOpenJDK out of the box. V1 supports only Azul Zulu OpenJDK
- V2 requires you to specify distribution along with the version. V1 defaults to Azul Zulu OpenJDK, only version input is required. Follow [the migration guide ](docs/switching-to-v2.md ) to switch from V1 to V2
2021-04-05 06:02:27 -04:00
## Usage
2022-09-09 08:49:09 -04:00
2022-09-22 09:55:15 -04:00
- `java-version` : _(required)_ The Java version to set up. Takes a whole or [semver ](#supported-version-syntax ) Java version.
2022-09-22 03:11:15 -04:00
2022-09-22 09:55:15 -04:00
- `distribution` : _(required)_ Java [distribution ](#supported-distributions ).
2022-09-22 03:11:15 -04:00
2022-09-22 09:55:15 -04:00
- `java-package` : The packaging variant of the choosen distribution. Possible values: `jdk` , `jre` , `jdk+fx` , `jre+fx` . Default value: `jdk` .
2022-09-22 03:11:15 -04:00
2022-09-22 09:55:15 -04:00
- `architecture` : The target architecture of the package. Possible values: `x86` , `x64` , `armv7` , `aarch64` , `ppc64le` . Default value: `x64` .
2022-09-22 03:11:15 -04:00
2022-09-22 09:55:15 -04:00
- `jdkFile` : If a use-case requires a custom distribution setup-java uses the compressed JDK from the location pointed by this input and will take care of the installation and caching on the VM.
2022-09-22 03:11:15 -04:00
2022-09-22 09:55:15 -04:00
- `check-latest` : Setting this option makes the action to check for the latest available version for the version spec.
2022-09-22 03:11:15 -04:00
2022-09-22 09:55:15 -04:00
- `cache` : Quick [setup caching ](#caching-packages-dependencies ) for the dependencies managed through one of the predifined package managers. It can be one of "maven", "gradle" or "sbt".
2022-09-22 03:11:15 -04:00
#### Maven options
2022-01-16 11:33:29 -05:00
The action has a bunch of inputs to generate maven's [settings.xml ](https://maven.apache.org/settings.html ) on the fly and pass the values to Apache Maven GPG Plugin as well as Apache Maven Toolchains. See [advanced usage ](docs/advanced-usage.md ) for more.
2022-09-22 03:11:15 -04:00
2022-09-22 09:55:15 -04:00
- `overwrite-settings` : By default action overwrites the settings.xml. In order to skip generation of file if it exists set this to `false` .
2022-09-22 03:11:15 -04:00
- `server-id` : ID of the distributionManagement repository in the pom.xml file. Default is `github` .
- `server-username` : Environment variable name for the username for authentication to the Apache Maven repository. Default is GITHUB_ACTOR.
- `server-password` : Environment variable name for password or token for authentication to the Apache Maven repository. Default is GITHUB_TOKEN.
2022-12-05 04:25:33 -05:00
- `settings-path` : Maven related setting to point to the directory where the settings.xml file will be written. Default is ~/.m2.
2022-09-22 03:11:15 -04:00
- `gpg-private-key` : GPG private key to import. Default is empty string.'
- `gpg-passphrase` : description: 'Environment variable name for the GPG private key passphrase. Default is GPG_PASSPHRASE.
2022-01-16 11:33:29 -05:00
- `mvn-toolchain-id` : Name of Maven Toolchain ID if the default name of `${distribution}_${java-version}` is not wanted.
- `mvn-toolchain-vendor` : Name of Maven Toolchain Vendor if the default name of `${distribution}` is not wanted.
2022-09-09 08:49:09 -04:00
### Basic Configuration
#### Eclipse Temurin
2021-08-06 06:12:36 -04:00
```yaml
steps:
2022-04-07 06:25:49 -04:00
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
2021-08-06 06:12:36 -04:00
with:
distribution: 'temurin' # See 'Supported distributions' for available options
2021-10-18 08:48:54 -04:00
java-version: '17'
2022-09-09 08:49:09 -04:00
- run: java HelloWorldApp.java
2021-08-06 06:12:36 -04:00
```
2022-09-09 08:49:09 -04:00
#### Azul Zulu OpenJDK
2021-04-05 06:02:27 -04:00
```yaml
steps:
2022-04-07 06:25:49 -04:00
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
2021-04-05 06:02:27 -04:00
with:
distribution: 'zulu' # See 'Supported distributions' for available options
2022-09-09 08:49:09 -04:00
java-version: '17'
- run: java HelloWorldApp.java
2021-04-05 06:02:27 -04:00
```
2020-05-02 07:33:15 -04:00
2021-04-05 06:02:27 -04:00
#### Supported version syntax
The `java-version` input supports an exact version or a version range using [SemVer ](https://semver.org/ ) notation:
2021-10-18 08:48:54 -04:00
- major versions: `8` , `11` , `16` , `17`
- more specific versions: `17.0` , `11.0` , `11.0.4` , `8.0.232` , `8.0.282+8`
2021-04-05 06:02:27 -04:00
- early access (EA) versions: `15-ea` , `15.0.0-ea` , `15.0.0-ea.2` , `15.0.0+2-ea`
2020-05-02 07:33:15 -04:00
2021-04-05 06:02:27 -04:00
#### Supported distributions
Currently, the following distributions are supported:
2021-08-23 04:09:55 -04:00
| Keyword | Distribution | Official site | License
2021-04-05 06:02:27 -04:00
|-|-|-|-|
2021-08-23 04:09:55 -04:00
| `temurin` | Eclipse Temurin | [Link ](https://adoptium.net/ ) | [Link ](https://adoptium.net/about.html )
2022-09-09 08:49:09 -04:00
| `zulu` | Azul Zulu OpenJDK | [Link ](https://www.azul.com/downloads/zulu-community/?package=jdk ) | [Link ](https://www.azul.com/products/zulu-and-zulu-enterprise/zulu-terms-of-use/ ) |
| `adopt` or `adopt-hotspot` | AdoptOpenJDK Hotspot | [Link ](https://adoptopenjdk.net/ ) | [Link ](https://adoptopenjdk.net/about.html ) |
| `adopt-openj9` | AdoptOpenJDK OpenJ9 | [Link ](https://adoptopenjdk.net/ ) | [Link ](https://adoptopenjdk.net/about.html ) |
2021-11-29 04:15:06 -05:00
| `liberica` | Liberica JDK | [Link ](https://bell-sw.com/ ) | [Link ](https://bell-sw.com/liberica_eula/ ) |
2021-12-08 13:50:14 -05:00
| `microsoft` | Microsoft Build of OpenJDK | [Link ](https://www.microsoft.com/openjdk ) | [Link ](https://docs.microsoft.com/java/openjdk/faq )
2022-04-29 06:38:36 -04:00
| `corretto` | Amazon Corretto Build of OpenJDK | [Link ](https://aws.amazon.com/corretto/ ) | [Link ](https://aws.amazon.com/corretto/faqs/ )
2020-05-02 07:33:15 -04:00
2021-04-05 06:02:27 -04:00
**NOTE:** The different distributors can provide discrepant list of available versions / supported configurations. Please refer to the official documentation to see the list of supported versions.
2020-05-02 07:33:15 -04:00
2022-09-09 08:49:09 -04:00
**NOTE:** AdoptOpenJDK got moved to Eclipse Temurin and won't be updated anymore. It is highly recommended to migrate workflows from `adopt` to `temurin` to keep receiving software and security updates. See more details in the [Good-bye AdoptOpenJDK post ](https://blog.adoptopenjdk.net/2021/08/goodbye-adoptopenjdk-hello-adoptium/ ).
2021-08-23 04:09:55 -04:00
2022-09-09 08:49:09 -04:00
**NOTE:** For Azul Zulu OpenJDK architectures x64 and arm64 are mapped to x86 / arm with proper hw_bitness.
2022-06-07 16:03:10 -04:00
2021-08-23 04:09:55 -04:00
### Caching packages dependencies
2022-04-26 03:35:00 -04:00
The action has a built-in functionality for caching and restoring dependencies. It uses [actions/cache ](https://github.com/actions/cache ) under hood for caching dependencies but requires less configuration settings. Supported package managers are gradle, maven and sbt. The format of the used cache key is `setup-java-${{ platform }}-${{ packageManager }}-${{ fileHash }}` , where the hash is based on the following files:
2022-10-17 12:34:41 -04:00
- gradle: `**/*.gradle*` , `**/gradle-wrapper.properties` , `buildSrc/**/Versions.kt` , `buildSrc/**/Dependencies.kt` , and `gradle/*.versions.toml`
2021-08-31 15:42:01 -04:00
- maven: `**/pom.xml`
2022-05-09 03:30:21 -04:00
- sbt: all sbt build definition files `**/*.sbt` , `**/project/build.properties` , `**/project/**.{scala,sbt}`
2021-08-31 15:42:01 -04:00
2022-04-07 04:58:22 -04:00
The workflow output `cache-hit` is set to indicate if an exact match was found for the key [as actions/cache does ](https://github.com/actions/cache/tree/main#outputs ).
2021-08-31 15:42:01 -04:00
The cache input is optional, and caching is turned off by default.
2021-08-23 04:09:55 -04:00
#### Caching gradle dependencies
2021-08-19 13:19:35 -04:00
```yaml
steps:
2022-04-07 06:25:49 -04:00
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
2021-08-19 13:19:35 -04:00
with:
2021-08-23 04:09:55 -04:00
distribution: 'temurin'
2022-09-09 08:49:09 -04:00
java-version: '17'
2021-08-23 04:09:55 -04:00
cache: 'gradle'
2021-09-13 05:53:49 -04:00
- run: ./gradlew build --no-daemon
2021-08-19 13:19:35 -04:00
```
2021-08-23 04:09:55 -04:00
#### Caching maven dependencies
```yaml
steps:
2022-04-07 06:25:49 -04:00
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
2021-08-23 04:09:55 -04:00
with:
distribution: 'temurin'
2022-09-09 08:49:09 -04:00
java-version: '17'
2021-08-23 04:09:55 -04:00
cache: 'maven'
- name: Build with Maven
run: mvn -B package --file pom.xml
```
2022-04-20 10:26:27 -04:00
#### Caching sbt dependencies
```yaml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: 'temurin'
2022-09-09 08:49:09 -04:00
java-version: '17'
2022-04-20 10:26:27 -04:00
cache: 'sbt'
- name: Build with SBT
run: sbt package
```
2021-04-05 06:02:27 -04:00
### Check latest
2022-09-09 08:49:09 -04:00
2021-04-05 06:02:27 -04:00
In the basic examples above, the `check-latest` flag defaults to `false` . When set to `false` , the action tries to first resolve a version of Java from the local tool cache on the runner. If unable to find a specific version in the cache, the action will download a version of Java. Use the default or set `check-latest` to `false` if you prefer a faster more consistent setup experience that prioritizes trying to use the cached versions at the expense of newer versions sometimes being available for download.
2020-01-09 03:45:37 -05:00
2021-04-05 06:02:27 -04:00
If `check-latest` is set to `true` , the action first checks if the cached version is the latest one. If the locally cached version is not the most up-to-date, the latest version of Java will be downloaded. Set `check-latest` to `true` if you want the most up-to-date version of Java to always be used. Setting `check-latest` to `true` has performance implications as downloading versions of Java is slower than using cached versions.
2020-05-02 07:33:15 -04:00
2021-04-05 06:02:27 -04:00
For Java distributions that are not cached on Hosted images, `check-latest` always behaves as `true` and downloads Java on-flight. Check out [Hosted Tool Cache ](docs/advanced-usage.md#Hosted-Tool-Cache ) for more details about pre-cached Java versions.
2020-01-09 03:45:37 -05:00
2019-07-17 10:56:53 -04:00
```yaml
2019-07-25 21:24:28 -04:00
steps:
2022-04-07 06:25:49 -04:00
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
2019-07-17 10:56:53 -04:00
with:
2022-10-10 09:28:56 -04:00
distribution: 'temurin'
2022-09-09 08:49:09 -04:00
java-version: '17'
2021-04-05 06:02:27 -04:00
check-latest: true
2022-09-09 08:49:09 -04:00
- run: java HelloWorldApp.java
2019-07-17 10:56:53 -04:00
```
2021-04-05 06:02:27 -04:00
### Testing against different Java versions
2019-07-17 10:56:53 -04:00
```yaml
jobs:
build:
2021-04-05 06:02:27 -04:00
runs-on: ubuntu-20.04
2019-07-17 10:56:53 -04:00
strategy:
matrix:
2022-09-09 08:49:09 -04:00
java: [ '8', '11', '17' ]
2021-04-05 06:02:27 -04:00
name: Java ${{ matrix.Java }} sample
2019-07-25 21:24:28 -04:00
steps:
2022-04-07 06:25:49 -04:00
- uses: actions/checkout@v3
2019-07-17 10:56:53 -04:00
- name: Setup java
2022-04-07 06:25:49 -04:00
uses: actions/setup-java@v3
2019-07-17 10:56:53 -04:00
with:
2021-04-05 06:02:27 -04:00
distribution: '< distribution > '
2019-08-13 16:24:39 -04:00
java-version: ${{ matrix.java }}
2022-09-09 08:49:09 -04:00
- run: java HelloWorldApp.java
2019-07-17 10:56:53 -04:00
```
2022-07-07 00:44:16 -04:00
### Install multiple JDKs
2022-09-08 09:26:54 -04:00
All versions are added to the PATH. The last version will be used and available globally. Other Java versions can be accessed through env variables with such specification as 'JAVA_HOME_{{ MAJOR_VERSION }}_{{ ARCHITECTURE }}'.
2022-07-07 00:44:16 -04:00
```yaml
steps:
2022-07-14 03:22:10 -04:00
- uses: actions/setup-java@v3
2022-07-07 00:44:16 -04:00
with:
2022-07-15 03:14:25 -04:00
distribution: '< distribution > '
2022-09-08 09:26:54 -04:00
java-version: |
8
11
15
2022-07-07 00:44:16 -04:00
```
2022-01-16 11:33:29 -05:00
### Using Maven Toolchains
In the example above multiple JDKs are installed for the same job. The result after the last JDK is installed is a Maven Toolchains declaration containing references to all three JDKs. The values for `id` , `version` , and `vendor` of the individual Toolchain entries are the given input values for `distribution` and `java-version` (`vendor` being the combination of `${distribution}_${java-version}` ) by default.
2022-09-09 08:49:09 -04:00
### Advanced Configuration
2022-01-16 11:33:29 -05:00
2021-04-05 06:02:27 -04:00
- [Selecting a Java distribution ](docs/advanced-usage.md#Selecting-a-Java-distribution )
2021-08-23 04:09:55 -04:00
- [Eclipse Temurin ](docs/advanced-usage.md#Eclipse-Temurin )
2021-04-05 06:02:27 -04:00
- [Adopt ](docs/advanced-usage.md#Adopt )
- [Zulu ](docs/advanced-usage.md#Zulu )
2021-11-29 04:15:06 -05:00
- [Liberica ](docs/advanced-usage.md#Liberica )
2022-05-04 07:23:54 -04:00
- [Microsoft ](docs/advanced-usage.md#Microsoft )
- [Amazon Corretto ](docs/advanced-usage.md#Amazon-Corretto )
2021-04-05 06:02:27 -04:00
- [Installing custom Java package type ](docs/advanced-usage.md#Installing-custom-Java-package-type )
- [Installing custom Java architecture ](docs/advanced-usage.md#Installing-custom-Java-architecture )
- [Installing custom Java distribution from local file ](docs/advanced-usage.md#Installing-Java-from-local-file )
- [Testing against different Java distributions ](docs/advanced-usage.md#Testing-against-different-Java-distributions )
- [Testing against different platforms ](docs/advanced-usage.md#Testing-against-different-platforms )
- [Publishing using Apache Maven ](docs/advanced-usage.md#Publishing-using-Apache-Maven )
- [Publishing using Gradle ](docs/advanced-usage.md#Publishing-using-Gradle )
- [Hosted Tool Cache ](docs/advanced-usage.md#Hosted-Tool-Cache )
2022-01-16 11:33:29 -05:00
- [Modifying Maven Toolchains ](docs/advanced-usage.md#Modifying-Maven-Toolchains )
2021-04-05 06:02:27 -04:00
## License
2019-07-17 10:56:53 -04:00
2021-05-17 09:38:02 -04:00
The scripts and documentation in this project are released under the [MIT License ](LICENSE ).
2019-07-17 10:56:53 -04:00
2022-07-31 19:37:40 -04:00
## Contributions
2019-07-17 10:56:53 -04:00
2022-09-22 09:55:15 -04:00
Contributions are welcome! See [Contributor's Guide ](docs/contributors.md )