From 33aba78939849a6f21fd5adceed72035e72d0030 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Fri, 12 Jun 2026 18:24:58 +0200 Subject: [PATCH] Add set-default option This option allows to install an additional JDK without making it the default one. I have wanted this for quite a long time as I'm running custom GitHub Actions with Java, which might require a specific JDK and I don't want to pollute the JDK that is used by the overall workflow calling the action. And I'm apparently not alone as there was a preexisting issue. Fixes #560 --- .github/workflows/e2e-versions.yml | 74 +++++++++++++ README.md | 2 + __tests__/distributors/base-installer.test.ts | 101 ++++++++++++++++++ action.yml | 4 + dist/cleanup/index.js | 3 +- dist/setup/index.js | 37 +++++-- docs/advanced-usage.md | 27 +++++ src/constants.ts | 1 + src/distributions/base-installer.ts | 27 ++++- src/distributions/base-models.ts | 1 + src/distributions/local/installer.ts | 12 ++- src/setup-java.ts | 5 + 12 files changed, 282 insertions(+), 12 deletions(-) diff --git a/.github/workflows/e2e-versions.yml b/.github/workflows/e2e-versions.yml index 7dc8d8a71..e3309e38f 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -545,3 +545,77 @@ jobs: - name: Verify Java run: bash __tests__/verify-java.sh "17.0.10" "${{ steps.setup-java.outputs.path }}" shell: bash + + setup-java-set-default: + name: set-default option - ${{ matrix.os }} + needs: setup-java-major-versions + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Setup Java 17 as default + uses: ./ + id: setup-java-17 + with: + distribution: 'temurin' + java-version: '17' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Setup Java 21 without setting as default + uses: ./ + id: setup-java-21 + with: + distribution: 'temurin' + java-version: '21' + set-default: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Verify JAVA_HOME still points to Java 17 + run: | + echo "JAVA_HOME=$JAVA_HOME" + echo "Java 17 path=${{ steps.setup-java-17.outputs.path }}" + if [ "$JAVA_HOME" != "${{ steps.setup-java-17.outputs.path }}" ]; then + echo "JAVA_HOME should still point to Java 17" + exit 1 + fi + shell: bash + - name: Verify java -version reports Java 17 + run: | + JAVA_VERSION=$(java -version 2>&1 | head -1) + echo "java -version: $JAVA_VERSION" + if ! echo "$JAVA_VERSION" | grep -q "17"; then + echo "Default java should still be version 17" + exit 1 + fi + shell: bash + - name: Verify JAVA_HOME_21 env var is set + run: | + $envName = "JAVA_HOME_21_${env:RUNNER_ARCH}" + $JavaVersionPath = [Environment]::GetEnvironmentVariable($envName) + if (-not $JavaVersionPath) { + Write-Host "$envName is not set" + exit 1 + } + if (-not (Test-Path "$JavaVersionPath")) { + Write-Host "$envName path does not exist: $JavaVersionPath" + exit 1 + } + Write-Host "$envName=$JavaVersionPath" + shell: pwsh + - name: Verify Java 21 outputs are set + run: | + echo "Java 21 path=${{ steps.setup-java-21.outputs.path }}" + echo "Java 21 version=${{ steps.setup-java-21.outputs.version }}" + if [ -z "${{ steps.setup-java-21.outputs.path }}" ]; then + echo "Java 21 path output should be set" + exit 1 + fi + if [ -z "${{ steps.setup-java-21.outputs.version }}" ]; then + echo "Java 21 version output should be set" + exit 1 + fi + shell: bash diff --git a/README.md b/README.md index 8a7392a9f..b7e9c8d57 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ For information about the latest releases, recent updates, and newly supported d - `check-latest`: Setting this option makes the action to check for the latest available version for the version spec. + - `set-default`: Set to `false` to install a JDK without making it the default. When `false`, `JAVA_HOME` and `PATH` are not updated, but `JAVA_HOME__` is still set so the JDK remains discoverable. Default value: `true`. See [Installing JDK without setting as default](docs/advanced-usage.md#Installing-JDK-without-setting-as-default) for more details. + - `cache`: Quick [setup caching](#caching-packages-dependencies) for the dependencies managed through one of the predefined package managers. It can be one of "maven", "gradle" or "sbt". - `cache-dependency-path`: The path to a dependency file: pom.xml, build.gradle, build.sbt, etc. This option can be used with the `cache` option. If this option is omitted, the action searches for the dependency file in the entire repository. This option supports wildcards and a list of file names for caching multiple dependencies. diff --git a/__tests__/distributors/base-installer.test.ts b/__tests__/distributors/base-installer.test.ts index 2a0b13ab1..fc158455c 100644 --- a/__tests__/distributors/base-installer.test.ts +++ b/__tests__/distributors/base-installer.test.ts @@ -545,6 +545,107 @@ describe('setupJava', () => { expect(spyCoreExportVariable).not.toHaveBeenCalled(); expect(spyCoreSetOutput).not.toHaveBeenCalled(); }); + + it('should not set JAVA_HOME and PATH when setDefault is false', async () => { + mockJavaBase = new EmptyJavaBase({ + version: '11', + architecture: 'x86', + packageType: 'jdk', + checkLatest: false, + setDefault: false + }); + await expect(mockJavaBase.setupJava()).resolves.toEqual({ + version: installedJavaVersion, + path: javaPath + }); + expect(spyCoreExportVariable).not.toHaveBeenCalledWith( + 'JAVA_HOME', + expect.anything() + ); + expect(spyCoreAddPath).not.toHaveBeenCalled(); + expect(spyCoreExportVariable).toHaveBeenCalledWith( + 'JAVA_HOME_11_X86', + javaPath + ); + expect(spyCoreSetOutput).toHaveBeenCalledWith('version', installedJavaVersion); + expect(spyCoreSetOutput).toHaveBeenCalledWith('path', javaPath); + expect(spyCoreSetOutput).toHaveBeenCalledWith('distribution', 'Empty'); + expect(spyCoreInfo).toHaveBeenCalledWith( + `Installing Java ${installedJavaVersion} (not setting as default)` + ); + }); + + it('should set JAVA_HOME and PATH when setDefault is true', async () => { + mockJavaBase = new EmptyJavaBase({ + version: '11', + architecture: 'x86', + packageType: 'jdk', + checkLatest: false, + setDefault: true + }); + await expect(mockJavaBase.setupJava()).resolves.toEqual({ + version: installedJavaVersion, + path: javaPath + }); + expect(spyCoreExportVariable).toHaveBeenCalledWith('JAVA_HOME', javaPath); + expect(spyCoreAddPath).toHaveBeenCalledWith(path.join(javaPath, 'bin')); + expect(spyCoreExportVariable).toHaveBeenCalledWith( + 'JAVA_HOME_11_X86', + javaPath + ); + expect(spyCoreInfo).toHaveBeenCalledWith( + `Setting Java ${installedJavaVersion} as the default` + ); + }); + + it('should default to setting as default when setDefault is not specified', async () => { + mockJavaBase = new EmptyJavaBase({ + version: '11', + architecture: 'x86', + packageType: 'jdk', + checkLatest: false + }); + await expect(mockJavaBase.setupJava()).resolves.toEqual({ + version: installedJavaVersion, + path: javaPath + }); + expect(spyCoreExportVariable).toHaveBeenCalledWith('JAVA_HOME', javaPath); + expect(spyCoreAddPath).toHaveBeenCalledWith(path.join(javaPath, 'bin')); + expect(spyCoreInfo).toHaveBeenCalledWith( + `Setting Java ${installedJavaVersion} as the default` + ); + }); + + it('should download and not set default when setDefault is false', async () => { + mockJavaBase = new EmptyJavaBase({ + version: '11', + architecture: 'x64', + packageType: 'jdk', + checkLatest: false, + setDefault: false + }); + await expect(mockJavaBase.setupJava()).resolves.toEqual({ + version: '11.0.9', + path: path.join('toolcache', 'Java_Empty_jdk', '11.0.9', 'x64') + }); + expect(spyCoreExportVariable).not.toHaveBeenCalledWith( + 'JAVA_HOME', + expect.anything() + ); + expect(spyCoreAddPath).not.toHaveBeenCalled(); + expect(spyCoreExportVariable).toHaveBeenCalledWith( + 'JAVA_HOME_11_X64', + path.join('toolcache', 'Java_Empty_jdk', '11.0.9', 'x64') + ); + expect(spyCoreSetOutput).toHaveBeenCalledWith('version', '11.0.9'); + expect(spyCoreSetOutput).toHaveBeenCalledWith( + 'path', + path.join('toolcache', 'Java_Empty_jdk', '11.0.9', 'x64') + ); + expect(spyCoreInfo).toHaveBeenCalledWith( + 'Installing Java 11.0.9 (not setting as default)' + ); + }); }); describe('normalizeVersion', () => { diff --git a/action.yml b/action.yml index 21a4269d7..4b9f8f249 100644 --- a/action.yml +++ b/action.yml @@ -24,6 +24,10 @@ inputs: description: 'Set this option if you want the action to check for the latest available version that satisfies the version spec' required: false default: false + set-default: + description: 'Set this option to false if you want to install a JDK but not make it the default. When false, JAVA_HOME and PATH are not updated, but JAVA_HOME__ is still set.' + required: false + default: true server-id: description: 'ID of the distributionManagement repository in the pom.xml file. Default is `github`' diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index eff7dac80..f7dafd310 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -51975,7 +51975,7 @@ else { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DISTRIBUTIONS_ONLY_MAJOR_VERSION = exports.INPUT_MVN_TOOLCHAIN_VENDOR = exports.INPUT_MVN_TOOLCHAIN_ID = exports.MVN_TOOLCHAINS_FILE = exports.MVN_SETTINGS_FILE = exports.M2_DIR = exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE_DEPENDENCY_PATH = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION_FILE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0; +exports.DISTRIBUTIONS_ONLY_MAJOR_VERSION = exports.INPUT_MVN_TOOLCHAIN_VENDOR = exports.INPUT_MVN_TOOLCHAIN_ID = exports.MVN_TOOLCHAINS_FILE = exports.MVN_SETTINGS_FILE = exports.M2_DIR = exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE_DEPENDENCY_PATH = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_SET_DEFAULT = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION_FILE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0; exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home'; exports.INPUT_JAVA_VERSION = 'java-version'; exports.INPUT_JAVA_VERSION_FILE = 'java-version-file'; @@ -51984,6 +51984,7 @@ exports.INPUT_JAVA_PACKAGE = 'java-package'; exports.INPUT_DISTRIBUTION = 'distribution'; exports.INPUT_JDK_FILE = 'jdkFile'; exports.INPUT_CHECK_LATEST = 'check-latest'; +exports.INPUT_SET_DEFAULT = 'set-default'; exports.INPUT_SERVER_ID = 'server-id'; exports.INPUT_SERVER_USERNAME = 'server-username'; exports.INPUT_SERVER_PASSWORD = 'server-password'; diff --git a/dist/setup/index.js b/dist/setup/index.js index a2efc14ae..9f1c14749 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -77734,7 +77734,7 @@ function isProbablyGradleDaemonProblem(packageManager, error) { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DISTRIBUTIONS_ONLY_MAJOR_VERSION = exports.INPUT_MVN_TOOLCHAIN_VENDOR = exports.INPUT_MVN_TOOLCHAIN_ID = exports.MVN_TOOLCHAINS_FILE = exports.MVN_SETTINGS_FILE = exports.M2_DIR = exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE_DEPENDENCY_PATH = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION_FILE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0; +exports.DISTRIBUTIONS_ONLY_MAJOR_VERSION = exports.INPUT_MVN_TOOLCHAIN_VENDOR = exports.INPUT_MVN_TOOLCHAIN_ID = exports.MVN_TOOLCHAINS_FILE = exports.MVN_SETTINGS_FILE = exports.M2_DIR = exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE_DEPENDENCY_PATH = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_SET_DEFAULT = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION_FILE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0; exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home'; exports.INPUT_JAVA_VERSION = 'java-version'; exports.INPUT_JAVA_VERSION_FILE = 'java-version-file'; @@ -77743,6 +77743,7 @@ exports.INPUT_JAVA_PACKAGE = 'java-package'; exports.INPUT_DISTRIBUTION = 'distribution'; exports.INPUT_JDK_FILE = 'jdkFile'; exports.INPUT_CHECK_LATEST = 'check-latest'; +exports.INPUT_SET_DEFAULT = 'set-default'; exports.INPUT_SERVER_ID = 'server-id'; exports.INPUT_SERVER_USERNAME = 'server-username'; exports.INPUT_SERVER_PASSWORD = 'server-password'; @@ -78042,6 +78043,7 @@ const constants_1 = __nccwpck_require__(69042); const os_1 = __importDefault(__nccwpck_require__(22037)); class JavaBase { constructor(distribution, installerOptions) { + var _a; this.distribution = distribution; this.http = new httpm.HttpClient('actions/setup-java', undefined, { allowRetries: true, @@ -78051,6 +78053,7 @@ class JavaBase { this.architecture = installerOptions.architecture || os_1.default.arch(); this.packageType = installerOptions.packageType; this.checkLatest = installerOptions.checkLatest; + this.setDefault = (_a = installerOptions.setDefault) !== null && _a !== void 0 ? _a : true; } setupJava() { var _a, _b; @@ -78166,8 +78169,14 @@ class JavaBase { if (process.platform === 'darwin' && fs.existsSync(macOSPostfixPath)) { foundJava.path = macOSPostfixPath; } - core.info(`Setting Java ${foundJava.version} as the default`); - this.setJavaDefault(foundJava.version, foundJava.path); + if (this.setDefault) { + core.info(`Setting Java ${foundJava.version} as the default`); + this.setJavaDefault(foundJava.version, foundJava.path); + } + else { + core.info(`Installing Java ${foundJava.version} (not setting as default)`); + this.setJavaEnvironment(foundJava.version, foundJava.path); + } return foundJava; }); } @@ -78273,6 +78282,13 @@ class JavaBase { core.setOutput('version', version); core.exportVariable(`JAVA_HOME_${majorVersion}_${this.architecture.toUpperCase()}`, toolPath); } + setJavaEnvironment(version, toolPath) { + const majorVersion = version.split('.')[0]; + core.setOutput('distribution', this.distribution); + core.setOutput('path', toolPath); + core.setOutput('version', version); + core.exportVariable(`JAVA_HOME_${majorVersion}_${this.architecture.toUpperCase()}`, toolPath); + } distributionArchitecture() { // default mappings of config architectures to distribution architectures // override if a distribution uses any different names; see liberica for an example @@ -79464,8 +79480,14 @@ class LocalDistribution extends base_installer_1.JavaBase { if (process.platform === 'darwin' && fs_1.default.existsSync(macOSPostfixPath)) { foundJava.path = macOSPostfixPath; } - core.info(`Setting Java ${foundJava.version} as default`); - this.setJavaDefault(foundJava.version, foundJava.path); + if (this.setDefault) { + core.info(`Setting Java ${foundJava.version} as the default`); + this.setJavaDefault(foundJava.version, foundJava.path); + } + else { + core.info(`Installing Java ${foundJava.version} (not setting as default)`); + this.setJavaEnvironment(foundJava.version, foundJava.path); + } return foundJava; }); } @@ -80689,6 +80711,7 @@ function run() { const cache = core.getInput(constants.INPUT_CACHE); const cacheDependencyPath = core.getInput(constants.INPUT_CACHE_DEPENDENCY_PATH); const checkLatest = (0, util_1.getBooleanInput)(constants.INPUT_CHECK_LATEST, false); + const setDefault = (0, util_1.getBooleanInput)(constants.INPUT_SET_DEFAULT, true); let toolchainIds = core.getMultilineInput(constants.INPUT_MVN_TOOLCHAIN_ID); core.startGroup('Installed distributions'); if (versions.length !== toolchainIds.length) { @@ -80701,6 +80724,7 @@ function run() { architecture, packageType, checkLatest, + setDefault, distributionName, jdkFile, toolchainIds @@ -80734,11 +80758,12 @@ function run() { run(); function installVersion(version, options, toolchainId = 0) { return __awaiter(this, void 0, void 0, function* () { - const { distributionName, jdkFile, architecture, packageType, checkLatest, toolchainIds } = options; + const { distributionName, jdkFile, architecture, packageType, checkLatest, setDefault, toolchainIds } = options; const installerOptions = { architecture, packageType, checkLatest, + setDefault, version }; const distribution = (0, distribution_factory_1.getJavaDistribution)(distributionName, installerOptions, jdkFile); diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index b4035c6e6..f9267d132 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -13,6 +13,7 @@ - [JetBrains](#JetBrains) - [Installing custom Java package type](#Installing-custom-Java-package-type) - [Installing custom Java architecture](#Installing-custom-Java-architecture) +- [Installing JDK without setting as default](#Installing-JDK-without-setting-as-default) - [Installing custom Java distribution from local file](#Installing-Java-from-local-file) - [Testing against different Java distributions](#Testing-against-different-Java-distributions) - [Testing against different platforms](#Testing-against-different-platforms) @@ -241,6 +242,32 @@ steps: - run: java -cp java HelloWorldApp ``` +## Installing JDK without setting as default + +When installing multiple JDKs, the last one installed becomes the default (`JAVA_HOME`, `PATH`). Use the `set-default` option to install a JDK without overriding the default. The installed JDK is still discoverable via the `JAVA_HOME__` environment variable (e.g. `JAVA_HOME_21_X64`). + +```yaml +steps: +- uses: actions/checkout@v6 +- uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '17' +- uses: actions/setup-java@v5 + id: setup-java-21 + with: + distribution: 'temurin' + java-version: '21' + set-default: false +- run: | + echo "Default java:" + java -version + echo "Java 21 home: $JAVA_HOME_21_X64" + echo "Java 21 path from output: ${{ steps.setup-java-21.outputs.path }}" +``` + +In this example, `JAVA_HOME` and `java` on `PATH` point to Java 17, while Java 21 is available via `JAVA_HOME_21_X64` or the step output `path`. + ## Installing Java from local file If your use-case requires a custom distribution or a version that is not provided by setup-java, you can download it manually and setup-java will take care of the installation and caching on the VM: diff --git a/src/constants.ts b/src/constants.ts index 93af286f8..485c35ec0 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -6,6 +6,7 @@ export const INPUT_JAVA_PACKAGE = 'java-package'; export const INPUT_DISTRIBUTION = 'distribution'; export const INPUT_JDK_FILE = 'jdkFile'; export const INPUT_CHECK_LATEST = 'check-latest'; +export const INPUT_SET_DEFAULT = 'set-default'; export const INPUT_SERVER_ID = 'server-id'; export const INPUT_SERVER_USERNAME = 'server-username'; export const INPUT_SERVER_PASSWORD = 'server-password'; diff --git a/src/distributions/base-installer.ts b/src/distributions/base-installer.ts index 5d9f3c82a..0f99a49da 100644 --- a/src/distributions/base-installer.ts +++ b/src/distributions/base-installer.ts @@ -20,6 +20,7 @@ export abstract class JavaBase { protected packageType: string; protected stable: boolean; protected checkLatest: boolean; + protected setDefault: boolean; constructor( protected distribution: string, @@ -36,6 +37,10 @@ export abstract class JavaBase { this.architecture = installerOptions.architecture || os.arch(); this.packageType = installerOptions.packageType; this.checkLatest = installerOptions.checkLatest; + this.setDefault = + installerOptions.setDefault !== undefined + ? installerOptions.setDefault + : true; } protected abstract downloadTool( @@ -169,8 +174,15 @@ export abstract class JavaBase { foundJava.path = macOSPostfixPath; } - core.info(`Setting Java ${foundJava.version} as the default`); - this.setJavaDefault(foundJava.version, foundJava.path); + if (this.setDefault) { + core.info(`Setting Java ${foundJava.version} as the default`); + this.setJavaDefault(foundJava.version, foundJava.path); + } else { + core.info( + `Installing Java ${foundJava.version} (not setting as default)` + ); + this.setJavaEnvironment(foundJava.version, foundJava.path); + } return foundJava; } @@ -310,6 +322,17 @@ export abstract class JavaBase { ); } + protected setJavaEnvironment(version: string, toolPath: string) { + const majorVersion = version.split('.')[0]; + core.setOutput('distribution', this.distribution); + core.setOutput('path', toolPath); + core.setOutput('version', version); + core.exportVariable( + `JAVA_HOME_${majorVersion}_${this.architecture.toUpperCase()}`, + toolPath + ); + } + protected distributionArchitecture(): string { // default mappings of config architectures to distribution architectures // override if a distribution uses any different names; see liberica for an example diff --git a/src/distributions/base-models.ts b/src/distributions/base-models.ts index 82344d585..fa57c97b2 100644 --- a/src/distributions/base-models.ts +++ b/src/distributions/base-models.ts @@ -3,6 +3,7 @@ export interface JavaInstallerOptions { architecture: string; packageType: string; checkLatest: boolean; + setDefault?: boolean; } export interface JavaInstallerResults { diff --git a/src/distributions/local/installer.ts b/src/distributions/local/installer.ts index adfac4998..cf422bc6a 100644 --- a/src/distributions/local/installer.ts +++ b/src/distributions/local/installer.ts @@ -69,9 +69,15 @@ export class LocalDistribution extends JavaBase { foundJava.path = macOSPostfixPath; } - core.info(`Setting Java ${foundJava.version} as default`); - - this.setJavaDefault(foundJava.version, foundJava.path); + if (this.setDefault) { + core.info(`Setting Java ${foundJava.version} as the default`); + this.setJavaDefault(foundJava.version, foundJava.path); + } else { + core.info( + `Installing Java ${foundJava.version} (not setting as default)` + ); + this.setJavaEnvironment(foundJava.version, foundJava.path); + } return foundJava; } diff --git a/src/setup-java.ts b/src/setup-java.ts index 73baf33a7..2d1667972 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -28,6 +28,7 @@ async function run() { constants.INPUT_CACHE_DEPENDENCY_PATH ); const checkLatest = getBooleanInput(constants.INPUT_CHECK_LATEST, false); + const setDefault = getBooleanInput(constants.INPUT_SET_DEFAULT, true); let toolchainIds = core.getMultilineInput(constants.INPUT_MVN_TOOLCHAIN_ID); core.startGroup('Installed distributions'); @@ -44,6 +45,7 @@ async function run() { architecture, packageType, checkLatest, + setDefault, distributionName, jdkFile, toolchainIds @@ -100,6 +102,7 @@ async function installVersion( architecture, packageType, checkLatest, + setDefault, toolchainIds } = options; @@ -107,6 +110,7 @@ async function installVersion( architecture, packageType, checkLatest, + setDefault, version }; @@ -141,6 +145,7 @@ interface installerInputsOptions { architecture: string; packageType: string; checkLatest: boolean; + setDefault: boolean; distributionName: string; jdkFile: string; toolchainIds: Array;