diff --git a/.github/workflows/e2e-local-file.yml b/.github/workflows/e2e-local-file.yml
index 4f4cd0327..baa026ae1 100644
--- a/.github/workflows/e2e-local-file.yml
+++ b/.github/workflows/e2e-local-file.yml
@@ -121,3 +121,39 @@ jobs:
       - name: Verify Java version
         run: bash __tests__/verify-java.sh "11.0.12" "${{ steps.setup-java.outputs.path }}"
         shell: bash
+
+  setup-java-remote-file-temurin:
+    name: Validate download from remote file Eclipse Temurin
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [macos-latest, windows-latest, ubuntu-latest]
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+      - name: Download Eclipse Temurin file
+        run: |
+          if ($IsLinux) {
+            $downloadUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.12%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz"
+            $localFilename = "java_package.tar.gz"
+          } elseif ($IsMacOS) {
+            $downloadUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.12%2B7/OpenJDK11U-jdk_x64_mac_hotspot_11.0.12_7.tar.gz"
+            $localFilename = "java_package.tar.gz"
+          } elseif ($IsWindows) {
+            $downloadUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.12%2B7/OpenJDK11U-jdk_x64_windows_hotspot_11.0.12_7.zip"
+            $localFilename = "java_package.zip"
+          }
+          echo "DownloadUrl=$downloadUrl" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
+        shell: pwsh
+      - name: setup-java
+        uses: ./
+        id: setup-java
+        with:
+          distribution: 'jdkfile'
+          jdkFile: ${{ env.DownloadUrl }}
+          java-version: '11.0.0-ea'
+          architecture: x64
+      - name: Verify Java version
+        run: bash __tests__/verify-java.sh "11.0.12" "${{ steps.setup-java.outputs.path }}"
+        shell: bash
diff --git a/README.md b/README.md
index c02eb6c92..fabe63e8c 100644
--- a/README.md
+++ b/README.md
@@ -144,6 +144,7 @@ jobs:
 - [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)
+- [Installing Java from remote archive](docs/advanced-usage.md#Installing-Java-from-remote-archive)
 - [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)
diff --git a/__tests__/distributors/local-installer.test.ts b/__tests__/distributors/local-installer.test.ts
index c1618971b..2eba99959 100644
--- a/__tests__/distributors/local-installer.test.ts
+++ b/__tests__/distributors/local-installer.test.ts
@@ -161,6 +161,36 @@ describe('setupJava', () => {
     );
   });
 
+  it('java is downloaded from remote jdkfile', async () => {
+    const inputs = {
+      version: '11.0.289',
+      architecture: 'x86',
+      packageType: 'jdk',
+      checkLatest: false
+    };
+    const expected = {
+      version: '11.0.289',
+      path: path.join('Java_jdkfile_jdk', inputs.version, inputs.architecture)
+    };
+
+    const jdkFile = 'https://example.com/jdk.tar.gz';
+
+    const spyTcDownloadTool = jest.spyOn(tc, 'downloadTool');
+    spyTcDownloadTool.mockReturnValue(Promise.resolve(expectedJdkFile));
+
+    mockJavaBase = new LocalDistribution(inputs, jdkFile);
+    await expect(mockJavaBase.setupJava()).resolves.toEqual(expected);
+    expect(spyTcFindAllVersions).toHaveBeenCalled();
+    expect(spyTcDownloadTool).toHaveBeenCalledWith(jdkFile);
+    expect(spyCoreInfo).not.toHaveBeenCalledWith(
+      `Resolved Java ${actualJavaVersion} from tool-cache`
+    );
+    expect(spyCoreInfo).toHaveBeenCalledWith(`Extracting Java from '${expectedJdkFile}'`);
+    expect(spyCoreInfo).toHaveBeenCalledWith(
+      `Java ${inputs.version} was not found in tool-cache. Trying to unpack JDK file...`
+    );
+  });
+
   it('jdk file is not found', async () => {
     const inputs = {
       version: '11.0.289',
diff --git a/action.yml b/action.yml
index c6af975a5..c599b5741 100644
--- a/action.yml
+++ b/action.yml
@@ -18,7 +18,7 @@ inputs:
     required: false
     default: 'x64'
   jdkFile:
-    description: 'Path to where the compressed JDK is located'
+    description: 'Path to where the compressed JDK is located, or URL where it should be downloaded from'
     required: false
   check-latest:
     description: 'Set this option if you want the action to check for the latest available version that satisfies the version spec'
diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js
index a9052b609..826acf97c 100644
--- a/dist/cleanup/index.js
+++ b/dist/cleanup/index.js
@@ -6059,99 +6059,99 @@ module.exports = require("punycode");
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.run = void 0;
-const core = __importStar(__webpack_require__(470));
-const gpg = __importStar(__webpack_require__(884));
-const constants = __importStar(__webpack_require__(694));
-const util_1 = __webpack_require__(322);
-const cache_1 = __webpack_require__(913);
-function removePrivateKeyFromKeychain() {
-    return __awaiter(this, void 0, void 0, function* () {
-        if (core.getInput(constants.INPUT_GPG_PRIVATE_KEY, { required: false })) {
-            core.info('Removing private key from keychain');
-            try {
-                const keyFingerprint = core.getState(constants.STATE_GPG_PRIVATE_KEY_FINGERPRINT);
-                yield gpg.deleteKey(keyFingerprint);
-            }
-            catch (error) {
-                core.setFailed(`Failed to remove private key due to: ${error.message}`);
-            }
-        }
-    });
-}
-/**
- * Check given input and run a save process for the specified package manager
- * @returns Promise that will be resolved when the save process finishes
- */
-function saveCache() {
-    return __awaiter(this, void 0, void 0, function* () {
-        const jobStatus = util_1.isJobStatusSuccess();
-        const cache = core.getInput(constants.INPUT_CACHE);
-        return jobStatus && cache ? cache_1.save(cache) : Promise.resolve();
-    });
-}
-/**
- * The save process is best-effort, and it should not make the workflow fail
- * even though this process throws an error.
- * @param promise the promise to ignore error from
- * @returns Promise that will ignore error reported by the given promise
- */
-function ignoreError(promise) {
-    return __awaiter(this, void 0, void 0, function* () {
-        return new Promise(resolve => {
-            promise
-                .catch(error => {
-                core.warning(error);
-                resolve(void 0);
-            })
-                .then(resolve);
-        });
-    });
-}
-function run() {
-    return __awaiter(this, void 0, void 0, function* () {
-        yield removePrivateKeyFromKeychain();
-        yield ignoreError(saveCache());
-    });
-}
-exports.run = run;
-if (require.main === require.cache[eval('__filename')]) {
-    run();
-}
-else {
-    // https://nodejs.org/api/modules.html#modules_accessing_the_main_module
-    core.info('the script is loaded as a module, so skipping the execution');
-}
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.run = void 0;
+const core = __importStar(__webpack_require__(470));
+const gpg = __importStar(__webpack_require__(884));
+const constants = __importStar(__webpack_require__(694));
+const util_1 = __webpack_require__(322);
+const cache_1 = __webpack_require__(913);
+function removePrivateKeyFromKeychain() {
+    return __awaiter(this, void 0, void 0, function* () {
+        if (core.getInput(constants.INPUT_GPG_PRIVATE_KEY, { required: false })) {
+            core.info('Removing private key from keychain');
+            try {
+                const keyFingerprint = core.getState(constants.STATE_GPG_PRIVATE_KEY_FINGERPRINT);
+                yield gpg.deleteKey(keyFingerprint);
+            }
+            catch (error) {
+                core.setFailed(`Failed to remove private key due to: ${error.message}`);
+            }
+        }
+    });
+}
+/**
+ * Check given input and run a save process for the specified package manager
+ * @returns Promise that will be resolved when the save process finishes
+ */
+function saveCache() {
+    return __awaiter(this, void 0, void 0, function* () {
+        const jobStatus = util_1.isJobStatusSuccess();
+        const cache = core.getInput(constants.INPUT_CACHE);
+        return jobStatus && cache ? cache_1.save(cache) : Promise.resolve();
+    });
+}
+/**
+ * The save process is best-effort, and it should not make the workflow fail
+ * even though this process throws an error.
+ * @param promise the promise to ignore error from
+ * @returns Promise that will ignore error reported by the given promise
+ */
+function ignoreError(promise) {
+    return __awaiter(this, void 0, void 0, function* () {
+        return new Promise(resolve => {
+            promise
+                .catch(error => {
+                core.warning(error);
+                resolve(void 0);
+            })
+                .then(resolve);
+        });
+    });
+}
+function run() {
+    return __awaiter(this, void 0, void 0, function* () {
+        yield removePrivateKeyFromKeychain();
+        yield ignoreError(saveCache());
+    });
+}
+exports.run = run;
+if (require.main === require.cache[eval('__filename')]) {
+    run();
+}
+else {
+    // https://nodejs.org/api/modules.html#modules_accessing_the_main_module
+    core.info('the script is loaded as a module, so skipping the execution');
+}
 
 
 /***/ }),
@@ -9077,116 +9077,116 @@ module.exports = satisfies
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
-const os_1 = __importDefault(__webpack_require__(87));
-const path_1 = __importDefault(__webpack_require__(622));
-const fs = __importStar(__webpack_require__(747));
-const semver = __importStar(__webpack_require__(876));
-const core = __importStar(__webpack_require__(470));
-const tc = __importStar(__webpack_require__(533));
-const constants_1 = __webpack_require__(694);
-function getTempDir() {
-    let tempDirectory = process.env['RUNNER_TEMP'] || os_1.default.tmpdir();
-    return tempDirectory;
-}
-exports.getTempDir = getTempDir;
-function getBooleanInput(inputName, defaultValue = false) {
-    return (core.getInput(inputName) || String(defaultValue)).toUpperCase() === 'TRUE';
-}
-exports.getBooleanInput = getBooleanInput;
-function getVersionFromToolcachePath(toolPath) {
-    if (toolPath) {
-        return path_1.default.basename(path_1.default.dirname(toolPath));
-    }
-    return toolPath;
-}
-exports.getVersionFromToolcachePath = getVersionFromToolcachePath;
-function extractJdkFile(toolPath, extension) {
-    return __awaiter(this, void 0, void 0, function* () {
-        if (!extension) {
-            extension = toolPath.endsWith('.tar.gz') ? 'tar.gz' : path_1.default.extname(toolPath);
-            if (extension.startsWith('.')) {
-                extension = extension.substring(1);
-            }
-        }
-        switch (extension) {
-            case 'tar.gz':
-            case 'tar':
-                return yield tc.extractTar(toolPath);
-            case 'zip':
-                return yield tc.extractZip(toolPath);
-            default:
-                return yield tc.extract7z(toolPath);
-        }
-    });
-}
-exports.extractJdkFile = extractJdkFile;
-function getDownloadArchiveExtension() {
-    return process.platform === 'win32' ? 'zip' : 'tar.gz';
-}
-exports.getDownloadArchiveExtension = getDownloadArchiveExtension;
-function isVersionSatisfies(range, version) {
-    var _a;
-    if (semver.valid(range)) {
-        // if full version with build digit is provided as a range (such as '1.2.3+4')
-        // we should check for exact equal via compareBuild
-        // since semver.satisfies doesn't handle 4th digit
-        const semRange = semver.parse(range);
-        if (semRange && ((_a = semRange.build) === null || _a === void 0 ? void 0 : _a.length) > 0) {
-            return semver.compareBuild(range, version) === 0;
-        }
-    }
-    return semver.satisfies(version, range);
-}
-exports.isVersionSatisfies = isVersionSatisfies;
-function getToolcachePath(toolName, version, architecture) {
-    var _a;
-    const toolcacheRoot = (_a = process.env['RUNNER_TOOL_CACHE']) !== null && _a !== void 0 ? _a : '';
-    const fullPath = path_1.default.join(toolcacheRoot, toolName, version, architecture);
-    if (fs.existsSync(fullPath)) {
-        return fullPath;
-    }
-    return null;
-}
-exports.getToolcachePath = getToolcachePath;
-function isJobStatusSuccess() {
-    const jobStatus = core.getInput(constants_1.INPUT_JOB_STATUS);
-    return jobStatus === 'success';
-}
-exports.isJobStatusSuccess = isJobStatusSuccess;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
+const os_1 = __importDefault(__webpack_require__(87));
+const path_1 = __importDefault(__webpack_require__(622));
+const fs = __importStar(__webpack_require__(747));
+const semver = __importStar(__webpack_require__(876));
+const core = __importStar(__webpack_require__(470));
+const tc = __importStar(__webpack_require__(533));
+const constants_1 = __webpack_require__(694);
+function getTempDir() {
+    let tempDirectory = process.env['RUNNER_TEMP'] || os_1.default.tmpdir();
+    return tempDirectory;
+}
+exports.getTempDir = getTempDir;
+function getBooleanInput(inputName, defaultValue = false) {
+    return (core.getInput(inputName) || String(defaultValue)).toUpperCase() === 'TRUE';
+}
+exports.getBooleanInput = getBooleanInput;
+function getVersionFromToolcachePath(toolPath) {
+    if (toolPath) {
+        return path_1.default.basename(path_1.default.dirname(toolPath));
+    }
+    return toolPath;
+}
+exports.getVersionFromToolcachePath = getVersionFromToolcachePath;
+function extractJdkFile(toolPath, extension) {
+    return __awaiter(this, void 0, void 0, function* () {
+        if (!extension) {
+            extension = toolPath.endsWith('.tar.gz') ? 'tar.gz' : path_1.default.extname(toolPath);
+            if (extension.startsWith('.')) {
+                extension = extension.substring(1);
+            }
+        }
+        switch (extension) {
+            case 'tar.gz':
+            case 'tar':
+                return yield tc.extractTar(toolPath);
+            case 'zip':
+                return yield tc.extractZip(toolPath);
+            default:
+                return yield tc.extract7z(toolPath);
+        }
+    });
+}
+exports.extractJdkFile = extractJdkFile;
+function getDownloadArchiveExtension() {
+    return process.platform === 'win32' ? 'zip' : 'tar.gz';
+}
+exports.getDownloadArchiveExtension = getDownloadArchiveExtension;
+function isVersionSatisfies(range, version) {
+    var _a;
+    if (semver.valid(range)) {
+        // if full version with build digit is provided as a range (such as '1.2.3+4')
+        // we should check for exact equal via compareBuild
+        // since semver.satisfies doesn't handle 4th digit
+        const semRange = semver.parse(range);
+        if (semRange && ((_a = semRange.build) === null || _a === void 0 ? void 0 : _a.length) > 0) {
+            return semver.compareBuild(range, version) === 0;
+        }
+    }
+    return semver.satisfies(version, range);
+}
+exports.isVersionSatisfies = isVersionSatisfies;
+function getToolcachePath(toolName, version, architecture) {
+    var _a;
+    const toolcacheRoot = (_a = process.env['RUNNER_TOOL_CACHE']) !== null && _a !== void 0 ? _a : '';
+    const fullPath = path_1.default.join(toolcacheRoot, toolName, version, architecture);
+    if (fs.existsSync(fullPath)) {
+        return fullPath;
+    }
+    return null;
+}
+exports.getToolcachePath = getToolcachePath;
+function isJobStatusSuccess() {
+    const jobStatus = core.getInput(constants_1.INPUT_JOB_STATUS);
+    return jobStatus === 'success';
+}
+exports.isJobStatusSuccess = isJobStatusSuccess;
 
 
 /***/ }),
@@ -43501,17 +43501,9 @@ AbortError.prototype = Object.create(Error.prototype);
 AbortError.prototype.constructor = AbortError;
 AbortError.prototype.name = 'AbortError';
 
-const URL$1 = Url.URL || whatwgUrl.URL;
-
 // fix an issue where "PassThrough", "resolve" aren't a named export for node <10
 const PassThrough$1 = Stream.PassThrough;
-
-const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
-	const orig = new URL$1(original).hostname;
-	const dest = new URL$1(destination).hostname;
-
-	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
-};
+const resolve_url = Url.resolve;
 
 /**
  * Fetch function
@@ -43599,19 +43591,7 @@ function fetch(url, opts) {
 				const location = headers.get('Location');
 
 				// HTTP fetch step 5.3
-				let locationURL = null;
-				try {
-					locationURL = location === null ? null : new URL$1(location, request.url).toString();
-				} catch (err) {
-					// error here can only be invalid URL in Location: header
-					// do not throw when options.redirect == manual
-					// let the user extract the errorneous redirect URL
-					if (request.redirect !== 'manual') {
-						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
-						finalize();
-						return;
-					}
-				}
+				const locationURL = location === null ? null : resolve_url(request.url, location);
 
 				// HTTP fetch step 5.5
 				switch (request.redirect) {
@@ -43659,12 +43639,6 @@ function fetch(url, opts) {
 							size: request.size
 						};
 
-						if (!isDomainOrSubdomain(request.url, locationURL)) {
-							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
-								requestOpts.headers.delete(name);
-							}
-						}
-
 						// HTTP-redirect fetch step 9
 						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
 							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
@@ -53625,28 +53599,28 @@ exports.saveCache = saveCache;
 /***/ (function(__unusedmodule, exports) {
 
 "use strict";
-
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = 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 = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
-exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
-exports.INPUT_JAVA_VERSION = 'java-version';
-exports.INPUT_ARCHITECTURE = 'architecture';
-exports.INPUT_JAVA_PACKAGE = 'java-package';
-exports.INPUT_DISTRIBUTION = 'distribution';
-exports.INPUT_JDK_FILE = 'jdkFile';
-exports.INPUT_CHECK_LATEST = 'check-latest';
-exports.INPUT_SERVER_ID = 'server-id';
-exports.INPUT_SERVER_USERNAME = 'server-username';
-exports.INPUT_SERVER_PASSWORD = 'server-password';
-exports.INPUT_SETTINGS_PATH = 'settings-path';
-exports.INPUT_OVERWRITE_SETTINGS = 'overwrite-settings';
-exports.INPUT_GPG_PRIVATE_KEY = 'gpg-private-key';
-exports.INPUT_GPG_PASSPHRASE = 'gpg-passphrase';
-exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined;
-exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
-exports.INPUT_CACHE = 'cache';
-exports.INPUT_JOB_STATUS = 'job-status';
-exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
+
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = 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 = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
+exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
+exports.INPUT_JAVA_VERSION = 'java-version';
+exports.INPUT_ARCHITECTURE = 'architecture';
+exports.INPUT_JAVA_PACKAGE = 'java-package';
+exports.INPUT_DISTRIBUTION = 'distribution';
+exports.INPUT_JDK_FILE = 'jdkFile';
+exports.INPUT_CHECK_LATEST = 'check-latest';
+exports.INPUT_SERVER_ID = 'server-id';
+exports.INPUT_SERVER_USERNAME = 'server-username';
+exports.INPUT_SERVER_PASSWORD = 'server-password';
+exports.INPUT_SETTINGS_PATH = 'settings-path';
+exports.INPUT_OVERWRITE_SETTINGS = 'overwrite-settings';
+exports.INPUT_GPG_PRIVATE_KEY = 'gpg-private-key';
+exports.INPUT_GPG_PASSPHRASE = 'gpg-passphrase';
+exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined;
+exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
+exports.INPUT_CACHE = 'cache';
+exports.INPUT_JOB_STATUS = 'job-status';
+exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
 
 
 /***/ }),
@@ -60189,74 +60163,74 @@ function coerce (version, options) {
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.deleteKey = exports.importKey = exports.PRIVATE_KEY_FILE = void 0;
-const fs = __importStar(__webpack_require__(747));
-const path = __importStar(__webpack_require__(622));
-const io = __importStar(__webpack_require__(1));
-const exec = __importStar(__webpack_require__(986));
-const util = __importStar(__webpack_require__(322));
-exports.PRIVATE_KEY_FILE = path.join(util.getTempDir(), 'private-key.asc');
-const PRIVATE_KEY_FINGERPRINT_REGEX = /\w{40}/;
-function importKey(privateKey) {
-    return __awaiter(this, void 0, void 0, function* () {
-        fs.writeFileSync(exports.PRIVATE_KEY_FILE, privateKey, {
-            encoding: 'utf-8',
-            flag: 'w'
-        });
-        let output = '';
-        const options = {
-            silent: true,
-            listeners: {
-                stdout: (data) => {
-                    output += data.toString();
-                }
-            }
-        };
-        yield exec.exec('gpg', ['--batch', '--import-options', 'import-show', '--import', exports.PRIVATE_KEY_FILE], options);
-        yield io.rmRF(exports.PRIVATE_KEY_FILE);
-        const match = output.match(PRIVATE_KEY_FINGERPRINT_REGEX);
-        return match && match[0];
-    });
-}
-exports.importKey = importKey;
-function deleteKey(keyFingerprint) {
-    return __awaiter(this, void 0, void 0, function* () {
-        yield exec.exec('gpg', ['--batch', '--yes', '--delete-secret-and-public-key', keyFingerprint], {
-            silent: true
-        });
-    });
-}
-exports.deleteKey = deleteKey;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.deleteKey = exports.importKey = exports.PRIVATE_KEY_FILE = void 0;
+const fs = __importStar(__webpack_require__(747));
+const path = __importStar(__webpack_require__(622));
+const io = __importStar(__webpack_require__(1));
+const exec = __importStar(__webpack_require__(986));
+const util = __importStar(__webpack_require__(322));
+exports.PRIVATE_KEY_FILE = path.join(util.getTempDir(), 'private-key.asc');
+const PRIVATE_KEY_FINGERPRINT_REGEX = /\w{40}/;
+function importKey(privateKey) {
+    return __awaiter(this, void 0, void 0, function* () {
+        fs.writeFileSync(exports.PRIVATE_KEY_FILE, privateKey, {
+            encoding: 'utf-8',
+            flag: 'w'
+        });
+        let output = '';
+        const options = {
+            silent: true,
+            listeners: {
+                stdout: (data) => {
+                    output += data.toString();
+                }
+            }
+        };
+        yield exec.exec('gpg', ['--batch', '--import-options', 'import-show', '--import', exports.PRIVATE_KEY_FILE], options);
+        yield io.rmRF(exports.PRIVATE_KEY_FILE);
+        const match = output.match(PRIVATE_KEY_FINGERPRINT_REGEX);
+        return match && match[0];
+    });
+}
+exports.importKey = importKey;
+function deleteKey(keyFingerprint) {
+    return __awaiter(this, void 0, void 0, function* () {
+        yield exec.exec('gpg', ['--batch', '--yes', '--delete-secret-and-public-key', keyFingerprint], {
+            silent: true
+        });
+    });
+}
+exports.deleteKey = deleteKey;
 
 
 /***/ }),
@@ -61803,160 +61777,160 @@ __exportStar(__webpack_require__(764), exports);
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-/**
- * @fileoverview this file provides methods handling dependency cache
- */
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.save = exports.restore = void 0;
-const path_1 = __webpack_require__(622);
-const os_1 = __importDefault(__webpack_require__(87));
-const cache = __importStar(__webpack_require__(692));
-const core = __importStar(__webpack_require__(470));
-const glob = __importStar(__webpack_require__(281));
-const STATE_CACHE_PRIMARY_KEY = 'cache-primary-key';
-const CACHE_MATCHED_KEY = 'cache-matched-key';
-const CACHE_KEY_PREFIX = 'setup-java';
-const supportedPackageManager = [
-    {
-        id: 'maven',
-        path: [path_1.join(os_1.default.homedir(), '.m2', 'repository')],
-        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---maven
-        pattern: ['**/pom.xml']
-    },
-    {
-        id: 'gradle',
-        path: [path_1.join(os_1.default.homedir(), '.gradle', 'caches'), path_1.join(os_1.default.homedir(), '.gradle', 'wrapper')],
-        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle
-        pattern: ['**/*.gradle*', '**/gradle-wrapper.properties']
-    }
-];
-function findPackageManager(id) {
-    const packageManager = supportedPackageManager.find(packageManager => packageManager.id === id);
-    if (packageManager === undefined) {
-        throw new Error(`unknown package manager specified: ${id}`);
-    }
-    return packageManager;
-}
-/**
- * A function that generates a cache key to use.
- * Format of the generated key will be "${{ platform }}-${{ id }}-${{ fileHash }}"".
- * If there is no file matched to {@link PackageManager.path}, the generated key ends with a dash (-).
- * @see {@link https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows#matching-a-cache-key|spec of cache key}
- */
-function computeCacheKey(packageManager) {
-    return __awaiter(this, void 0, void 0, function* () {
-        const hash = yield glob.hashFiles(packageManager.pattern.join('\n'));
-        return `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${packageManager.id}-${hash}`;
-    });
-}
-/**
- * Restore the dependency cache
- * @param id ID of the package manager, should be "maven" or "gradle"
- */
-function restore(id) {
-    return __awaiter(this, void 0, void 0, function* () {
-        const packageManager = findPackageManager(id);
-        const primaryKey = yield computeCacheKey(packageManager);
-        core.debug(`primary key is ${primaryKey}`);
-        core.saveState(STATE_CACHE_PRIMARY_KEY, primaryKey);
-        if (primaryKey.endsWith('-')) {
-            throw new Error(`No file in ${process.cwd()} matched to [${packageManager.pattern}], make sure you have checked out the target repository`);
-        }
-        const matchedKey = yield cache.restoreCache(packageManager.path, primaryKey, [
-            `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${id}`
-        ]);
-        if (matchedKey) {
-            core.saveState(CACHE_MATCHED_KEY, matchedKey);
-            core.info(`Cache restored from key: ${matchedKey}`);
-        }
-        else {
-            core.info(`${packageManager.id} cache is not found`);
-        }
-    });
-}
-exports.restore = restore;
-/**
- * Save the dependency cache
- * @param id ID of the package manager, should be "maven" or "gradle"
- */
-function save(id) {
-    return __awaiter(this, void 0, void 0, function* () {
-        const packageManager = findPackageManager(id);
-        const matchedKey = core.getState(CACHE_MATCHED_KEY);
-        // Inputs are re-evaluted before the post action, so we want the original key used for restore
-        const primaryKey = core.getState(STATE_CACHE_PRIMARY_KEY);
-        if (!primaryKey) {
-            core.warning('Error retrieving key from state.');
-            return;
-        }
-        else if (matchedKey === primaryKey) {
-            // no change in target directories
-            core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
-            return;
-        }
-        try {
-            yield cache.saveCache(packageManager.path, primaryKey);
-            core.info(`Cache saved with the key: ${primaryKey}`);
-        }
-        catch (error) {
-            if (error.name === cache.ReserveCacheError.name) {
-                core.info(error.message);
-            }
-            else {
-                if (isProbablyGradleDaemonProblem(packageManager, error)) {
-                    core.warning('Failed to save Gradle cache on Windows. If tar.exe reported "Permission denied", try to run Gradle with `--no-daemon` option. Refer to https://github.com/actions/cache/issues/454 for details.');
-                }
-                throw error;
-            }
-        }
-    });
-}
-exports.save = save;
-/**
- * @param packageManager the specified package manager by user
- * @param error the error thrown by the saveCache
- * @returns true if the given error seems related to the {@link https://github.com/actions/cache/issues/454|running Gradle Daemon issue}.
- * @see {@link https://github.com/actions/cache/issues/454#issuecomment-840493935|why --no-daemon is necessary}
- */
-function isProbablyGradleDaemonProblem(packageManager, error) {
-    if (packageManager.id !== 'gradle' || process.env['RUNNER_OS'] !== 'Windows') {
-        return false;
-    }
-    const message = error.message || '';
-    return message.startsWith('Tar failed with error: ');
-}
+
+/**
+ * @fileoverview this file provides methods handling dependency cache
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.save = exports.restore = void 0;
+const path_1 = __webpack_require__(622);
+const os_1 = __importDefault(__webpack_require__(87));
+const cache = __importStar(__webpack_require__(692));
+const core = __importStar(__webpack_require__(470));
+const glob = __importStar(__webpack_require__(281));
+const STATE_CACHE_PRIMARY_KEY = 'cache-primary-key';
+const CACHE_MATCHED_KEY = 'cache-matched-key';
+const CACHE_KEY_PREFIX = 'setup-java';
+const supportedPackageManager = [
+    {
+        id: 'maven',
+        path: [path_1.join(os_1.default.homedir(), '.m2', 'repository')],
+        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---maven
+        pattern: ['**/pom.xml']
+    },
+    {
+        id: 'gradle',
+        path: [path_1.join(os_1.default.homedir(), '.gradle', 'caches'), path_1.join(os_1.default.homedir(), '.gradle', 'wrapper')],
+        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle
+        pattern: ['**/*.gradle*', '**/gradle-wrapper.properties']
+    }
+];
+function findPackageManager(id) {
+    const packageManager = supportedPackageManager.find(packageManager => packageManager.id === id);
+    if (packageManager === undefined) {
+        throw new Error(`unknown package manager specified: ${id}`);
+    }
+    return packageManager;
+}
+/**
+ * A function that generates a cache key to use.
+ * Format of the generated key will be "${{ platform }}-${{ id }}-${{ fileHash }}"".
+ * If there is no file matched to {@link PackageManager.path}, the generated key ends with a dash (-).
+ * @see {@link https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows#matching-a-cache-key|spec of cache key}
+ */
+function computeCacheKey(packageManager) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const hash = yield glob.hashFiles(packageManager.pattern.join('\n'));
+        return `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${packageManager.id}-${hash}`;
+    });
+}
+/**
+ * Restore the dependency cache
+ * @param id ID of the package manager, should be "maven" or "gradle"
+ */
+function restore(id) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const packageManager = findPackageManager(id);
+        const primaryKey = yield computeCacheKey(packageManager);
+        core.debug(`primary key is ${primaryKey}`);
+        core.saveState(STATE_CACHE_PRIMARY_KEY, primaryKey);
+        if (primaryKey.endsWith('-')) {
+            throw new Error(`No file in ${process.cwd()} matched to [${packageManager.pattern}], make sure you have checked out the target repository`);
+        }
+        const matchedKey = yield cache.restoreCache(packageManager.path, primaryKey, [
+            `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${id}`
+        ]);
+        if (matchedKey) {
+            core.saveState(CACHE_MATCHED_KEY, matchedKey);
+            core.info(`Cache restored from key: ${matchedKey}`);
+        }
+        else {
+            core.info(`${packageManager.id} cache is not found`);
+        }
+    });
+}
+exports.restore = restore;
+/**
+ * Save the dependency cache
+ * @param id ID of the package manager, should be "maven" or "gradle"
+ */
+function save(id) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const packageManager = findPackageManager(id);
+        const matchedKey = core.getState(CACHE_MATCHED_KEY);
+        // Inputs are re-evaluted before the post action, so we want the original key used for restore
+        const primaryKey = core.getState(STATE_CACHE_PRIMARY_KEY);
+        if (!primaryKey) {
+            core.warning('Error retrieving key from state.');
+            return;
+        }
+        else if (matchedKey === primaryKey) {
+            // no change in target directories
+            core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
+            return;
+        }
+        try {
+            yield cache.saveCache(packageManager.path, primaryKey);
+            core.info(`Cache saved with the key: ${primaryKey}`);
+        }
+        catch (error) {
+            if (error.name === cache.ReserveCacheError.name) {
+                core.info(error.message);
+            }
+            else {
+                if (isProbablyGradleDaemonProblem(packageManager, error)) {
+                    core.warning('Failed to save Gradle cache on Windows. If tar.exe reported "Permission denied", try to run Gradle with `--no-daemon` option. Refer to https://github.com/actions/cache/issues/454 for details.');
+                }
+                throw error;
+            }
+        }
+    });
+}
+exports.save = save;
+/**
+ * @param packageManager the specified package manager by user
+ * @param error the error thrown by the saveCache
+ * @returns true if the given error seems related to the {@link https://github.com/actions/cache/issues/454|running Gradle Daemon issue}.
+ * @see {@link https://github.com/actions/cache/issues/454#issuecomment-840493935|why --no-daemon is necessary}
+ */
+function isProbablyGradleDaemonProblem(packageManager, error) {
+    if (packageManager.id !== 'gradle' || process.env['RUNNER_OS'] !== 'Windows') {
+        return false;
+    }
+    const message = error.message || '';
+    return message.startsWith('Tar failed with error: ');
+}
 
 
 /***/ }),
diff --git a/dist/setup/index.js b/dist/setup/index.js
index b1445c710..66a8604fb 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -4677,167 +4677,167 @@ exports.toCommandValue = toCommandValue;
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.JavaBase = void 0;
-const tc = __importStar(__webpack_require__(139));
-const core = __importStar(__webpack_require__(470));
-const fs = __importStar(__webpack_require__(747));
-const semver_1 = __importDefault(__webpack_require__(876));
-const path_1 = __importDefault(__webpack_require__(622));
-const httpm = __importStar(__webpack_require__(539));
-const util_1 = __webpack_require__(322);
-const constants_1 = __webpack_require__(211);
-class JavaBase {
-    constructor(distribution, installerOptions) {
-        this.distribution = distribution;
-        this.http = new httpm.HttpClient('actions/setup-java', undefined, {
-            allowRetries: true,
-            maxRetries: 3
-        });
-        ({ version: this.version, stable: this.stable } = this.normalizeVersion(installerOptions.version));
-        this.architecture = installerOptions.architecture;
-        this.packageType = installerOptions.packageType;
-        this.checkLatest = installerOptions.checkLatest;
-    }
-    setupJava() {
-        return __awaiter(this, void 0, void 0, function* () {
-            let foundJava = this.findInToolcache();
-            if (foundJava && !this.checkLatest) {
-                core.info(`Resolved Java ${foundJava.version} from tool-cache`);
-            }
-            else {
-                core.info('Trying to resolve the latest version from remote');
-                const javaRelease = yield this.findPackageForDownload(this.version);
-                core.info(`Resolved latest version as ${javaRelease.version}`);
-                if ((foundJava === null || foundJava === void 0 ? void 0 : foundJava.version) === javaRelease.version) {
-                    core.info(`Resolved Java ${foundJava.version} from tool-cache`);
-                }
-                else {
-                    core.info('Trying to download...');
-                    foundJava = yield this.downloadTool(javaRelease);
-                    core.info(`Java ${foundJava.version} was downloaded`);
-                }
-            }
-            // JDK folder may contain postfix "Contents/Home" on macOS
-            const macOSPostfixPath = path_1.default.join(foundJava.path, constants_1.MACOS_JAVA_CONTENT_POSTFIX);
-            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);
-            return foundJava;
-        });
-    }
-    get toolcacheFolderName() {
-        return `Java_${this.distribution}_${this.packageType}`;
-    }
-    getToolcacheVersionName(version) {
-        if (!this.stable) {
-            if (version.includes('+')) {
-                return version.replace('+', '-ea.');
-            }
-            else {
-                return `${version}-ea`;
-            }
-        }
-        // Kotlin and some Java dependencies don't work properly when Java path contains "+" sign
-        // so replace "/hostedtoolcache/Java/11.0.3+4/x64" to "/hostedtoolcache/Java/11.0.3-4/x64" when saves to cache
-        // related issue: https://github.com/actions/virtual-environments/issues/3014
-        return version.replace('+', '-');
-    }
-    findInToolcache() {
-        // we can't use tc.find directly because firstly, we need to filter versions by stability flag
-        // if *-ea is provided, take only ea versions from toolcache, otherwise - only stable versions
-        const availableVersions = tc
-            .findAllVersions(this.toolcacheFolderName, this.architecture)
-            .map(item => {
-            return {
-                version: item
-                    .replace('-ea.', '+')
-                    .replace(/-ea$/, '')
-                    // Kotlin and some Java dependencies don't work properly when Java path contains "+" sign
-                    // so replace "/hostedtoolcache/Java/11.0.3-4/x64" to "/hostedtoolcache/Java/11.0.3+4/x64" when retrieves  to cache
-                    // related issue: https://github.com/actions/virtual-environments/issues/3014
-                    .replace('-', '+'),
-                path: util_1.getToolcachePath(this.toolcacheFolderName, item, this.architecture) || '',
-                stable: !item.includes('-ea')
-            };
-        })
-            .filter(item => item.stable === this.stable);
-        const satisfiedVersions = availableVersions
-            .filter(item => util_1.isVersionSatisfies(this.version, item.version))
-            .filter(item => item.path)
-            .sort((a, b) => {
-            return -semver_1.default.compareBuild(a.version, b.version);
-        });
-        if (!satisfiedVersions || satisfiedVersions.length === 0) {
-            return null;
-        }
-        return {
-            version: satisfiedVersions[0].version,
-            path: satisfiedVersions[0].path
-        };
-    }
-    normalizeVersion(version) {
-        let stable = true;
-        if (version.endsWith('-ea')) {
-            version = version.replace(/-ea$/, '');
-            stable = false;
-        }
-        else if (version.includes('-ea.')) {
-            // transform '11.0.3-ea.2' -> '11.0.3+2'
-            version = version.replace('-ea.', '+');
-            stable = false;
-        }
-        if (!semver_1.default.validRange(version)) {
-            throw new Error(`The string '${version}' is not valid SemVer notation for a Java version. Please check README file for code snippets and more detailed information`);
-        }
-        return {
-            version,
-            stable
-        };
-    }
-    setJavaDefault(version, toolPath) {
-        core.exportVariable('JAVA_HOME', toolPath);
-        core.addPath(path_1.default.join(toolPath, 'bin'));
-        core.setOutput('distribution', this.distribution);
-        core.setOutput('path', toolPath);
-        core.setOutput('version', version);
-    }
-}
-exports.JavaBase = JavaBase;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.JavaBase = void 0;
+const tc = __importStar(__webpack_require__(139));
+const core = __importStar(__webpack_require__(470));
+const fs = __importStar(__webpack_require__(747));
+const semver_1 = __importDefault(__webpack_require__(876));
+const path_1 = __importDefault(__webpack_require__(622));
+const httpm = __importStar(__webpack_require__(539));
+const util_1 = __webpack_require__(322);
+const constants_1 = __webpack_require__(211);
+class JavaBase {
+    constructor(distribution, installerOptions) {
+        this.distribution = distribution;
+        this.http = new httpm.HttpClient('actions/setup-java', undefined, {
+            allowRetries: true,
+            maxRetries: 3
+        });
+        ({ version: this.version, stable: this.stable } = this.normalizeVersion(installerOptions.version));
+        this.architecture = installerOptions.architecture;
+        this.packageType = installerOptions.packageType;
+        this.checkLatest = installerOptions.checkLatest;
+    }
+    setupJava() {
+        return __awaiter(this, void 0, void 0, function* () {
+            let foundJava = this.findInToolcache();
+            if (foundJava && !this.checkLatest) {
+                core.info(`Resolved Java ${foundJava.version} from tool-cache`);
+            }
+            else {
+                core.info('Trying to resolve the latest version from remote');
+                const javaRelease = yield this.findPackageForDownload(this.version);
+                core.info(`Resolved latest version as ${javaRelease.version}`);
+                if ((foundJava === null || foundJava === void 0 ? void 0 : foundJava.version) === javaRelease.version) {
+                    core.info(`Resolved Java ${foundJava.version} from tool-cache`);
+                }
+                else {
+                    core.info('Trying to download...');
+                    foundJava = yield this.downloadTool(javaRelease);
+                    core.info(`Java ${foundJava.version} was downloaded`);
+                }
+            }
+            // JDK folder may contain postfix "Contents/Home" on macOS
+            const macOSPostfixPath = path_1.default.join(foundJava.path, constants_1.MACOS_JAVA_CONTENT_POSTFIX);
+            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);
+            return foundJava;
+        });
+    }
+    get toolcacheFolderName() {
+        return `Java_${this.distribution}_${this.packageType}`;
+    }
+    getToolcacheVersionName(version) {
+        if (!this.stable) {
+            if (version.includes('+')) {
+                return version.replace('+', '-ea.');
+            }
+            else {
+                return `${version}-ea`;
+            }
+        }
+        // Kotlin and some Java dependencies don't work properly when Java path contains "+" sign
+        // so replace "/hostedtoolcache/Java/11.0.3+4/x64" to "/hostedtoolcache/Java/11.0.3-4/x64" when saves to cache
+        // related issue: https://github.com/actions/virtual-environments/issues/3014
+        return version.replace('+', '-');
+    }
+    findInToolcache() {
+        // we can't use tc.find directly because firstly, we need to filter versions by stability flag
+        // if *-ea is provided, take only ea versions from toolcache, otherwise - only stable versions
+        const availableVersions = tc
+            .findAllVersions(this.toolcacheFolderName, this.architecture)
+            .map(item => {
+            return {
+                version: item
+                    .replace('-ea.', '+')
+                    .replace(/-ea$/, '')
+                    // Kotlin and some Java dependencies don't work properly when Java path contains "+" sign
+                    // so replace "/hostedtoolcache/Java/11.0.3-4/x64" to "/hostedtoolcache/Java/11.0.3+4/x64" when retrieves  to cache
+                    // related issue: https://github.com/actions/virtual-environments/issues/3014
+                    .replace('-', '+'),
+                path: util_1.getToolcachePath(this.toolcacheFolderName, item, this.architecture) || '',
+                stable: !item.includes('-ea')
+            };
+        })
+            .filter(item => item.stable === this.stable);
+        const satisfiedVersions = availableVersions
+            .filter(item => util_1.isVersionSatisfies(this.version, item.version))
+            .filter(item => item.path)
+            .sort((a, b) => {
+            return -semver_1.default.compareBuild(a.version, b.version);
+        });
+        if (!satisfiedVersions || satisfiedVersions.length === 0) {
+            return null;
+        }
+        return {
+            version: satisfiedVersions[0].version,
+            path: satisfiedVersions[0].path
+        };
+    }
+    normalizeVersion(version) {
+        let stable = true;
+        if (version.endsWith('-ea')) {
+            version = version.replace(/-ea$/, '');
+            stable = false;
+        }
+        else if (version.includes('-ea.')) {
+            // transform '11.0.3-ea.2' -> '11.0.3+2'
+            version = version.replace('-ea.', '+');
+            stable = false;
+        }
+        if (!semver_1.default.validRange(version)) {
+            throw new Error(`The string '${version}' is not valid SemVer notation for a Java version. Please check README file for code snippets and more detailed information`);
+        }
+        return {
+            version,
+            stable
+        };
+    }
+    setJavaDefault(version, toolPath) {
+        core.exportVariable('JAVA_HOME', toolPath);
+        core.addPath(path_1.default.join(toolPath, 'bin'));
+        core.setOutput('distribution', this.distribution);
+        core.setOutput('path', toolPath);
+        core.setOutput('version', version);
+    }
+}
+exports.JavaBase = JavaBase;
 
 
 /***/ }),
@@ -11444,101 +11444,111 @@ module.exports = parseOptions
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.LocalDistribution = void 0;
-const tc = __importStar(__webpack_require__(139));
-const core = __importStar(__webpack_require__(470));
-const fs_1 = __importDefault(__webpack_require__(747));
-const path_1 = __importDefault(__webpack_require__(622));
-const base_installer_1 = __webpack_require__(83);
-const util_1 = __webpack_require__(322);
-const constants_1 = __webpack_require__(211);
-class LocalDistribution extends base_installer_1.JavaBase {
-    constructor(installerOptions, jdkFile) {
-        super('jdkfile', installerOptions);
-        this.jdkFile = jdkFile;
-    }
-    setupJava() {
-        return __awaiter(this, void 0, void 0, function* () {
-            let foundJava = this.findInToolcache();
-            if (foundJava) {
-                core.info(`Resolved Java ${foundJava.version} from tool-cache`);
-            }
-            else {
-                core.info(`Java ${this.version} was not found in tool-cache. Trying to unpack JDK file...`);
-                if (!this.jdkFile) {
-                    throw new Error("'jdkFile' is not specified");
-                }
-                const jdkFilePath = path_1.default.resolve(this.jdkFile);
-                const stats = fs_1.default.statSync(jdkFilePath);
-                if (!stats.isFile()) {
-                    throw new Error(`JDK file was not found in path '${jdkFilePath}'`);
-                }
-                core.info(`Extracting Java from '${jdkFilePath}'`);
-                const extractedJavaPath = yield util_1.extractJdkFile(jdkFilePath);
-                const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
-                const archivePath = path_1.default.join(extractedJavaPath, archiveName);
-                const javaVersion = this.version;
-                let javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaVersion), this.architecture);
-                // for different Java distributions, postfix can exist or not so need to check both cases
-                if (process.platform === 'darwin' &&
-                    fs_1.default.existsSync(path_1.default.join(javaPath, constants_1.MACOS_JAVA_CONTENT_POSTFIX))) {
-                    javaPath = path_1.default.join(javaPath, constants_1.MACOS_JAVA_CONTENT_POSTFIX);
-                }
-                foundJava = {
-                    version: javaVersion,
-                    path: javaPath
-                };
-            }
-            core.info(`Setting Java ${foundJava.version} as default`);
-            this.setJavaDefault(foundJava.version, foundJava.path);
-            return foundJava;
-        });
-    }
-    findPackageForDownload(version) {
-        return __awaiter(this, void 0, void 0, function* () {
-            throw new Error('This method should not be implemented in local file provider');
-        });
-    }
-    downloadTool(javaRelease) {
-        return __awaiter(this, void 0, void 0, function* () {
-            throw new Error('This method should not be implemented in local file provider');
-        });
-    }
-}
-exports.LocalDistribution = LocalDistribution;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.LocalDistribution = void 0;
+const tc = __importStar(__webpack_require__(139));
+const core = __importStar(__webpack_require__(470));
+const fs_1 = __importDefault(__webpack_require__(747));
+const path_1 = __importDefault(__webpack_require__(622));
+const base_installer_1 = __webpack_require__(83);
+const util_1 = __webpack_require__(322);
+const constants_1 = __webpack_require__(211);
+class LocalDistribution extends base_installer_1.JavaBase {
+    constructor(installerOptions, jdkFile) {
+        super('jdkfile', installerOptions);
+        this.jdkFile = jdkFile;
+    }
+    setupJava() {
+        return __awaiter(this, void 0, void 0, function* () {
+            let foundJava = this.findInToolcache();
+            if (foundJava) {
+                core.info(`Resolved Java ${foundJava.version} from tool-cache`);
+            }
+            else {
+                core.info(`Java ${this.version} was not found in tool-cache. Trying to unpack JDK file...`);
+                if (!this.jdkFile) {
+                    throw new Error("'jdkFile' is not specified");
+                }
+                let jdkFilePath;
+                let extension;
+                if (this.jdkFile.match(/^https?:\/\//)) {
+                    core.info(`Downloading Java archive from ${this.jdkFile}...`);
+                    const javaRelease = yield tc.downloadTool(this.jdkFile);
+                    jdkFilePath = path_1.default.resolve(javaRelease);
+                    extension = util_1.getDownloadArchiveExtension();
+                }
+                else {
+                    jdkFilePath = path_1.default.resolve(this.jdkFile);
+                }
+                const stats = fs_1.default.statSync(jdkFilePath);
+                if (!stats.isFile()) {
+                    throw new Error(`JDK file was not found in path '${jdkFilePath}'`);
+                }
+                core.info(`Extracting Java from '${jdkFilePath}'`);
+                const extractedJavaPath = yield util_1.extractJdkFile(jdkFilePath, extension);
+                const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
+                const archivePath = path_1.default.join(extractedJavaPath, archiveName);
+                const javaVersion = this.version;
+                let javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaVersion), this.architecture);
+                // for different Java distributions, postfix can exist or not so need to check both cases
+                if (process.platform === 'darwin' &&
+                    fs_1.default.existsSync(path_1.default.join(javaPath, constants_1.MACOS_JAVA_CONTENT_POSTFIX))) {
+                    javaPath = path_1.default.join(javaPath, constants_1.MACOS_JAVA_CONTENT_POSTFIX);
+                }
+                foundJava = {
+                    version: javaVersion,
+                    path: javaPath
+                };
+            }
+            core.info(`Setting Java ${foundJava.version} as default`);
+            this.setJavaDefault(foundJava.version, foundJava.path);
+            return foundJava;
+        });
+    }
+    findPackageForDownload(version) {
+        return __awaiter(this, void 0, void 0, function* () {
+            throw new Error('This method should not be implemented in local file provider');
+        });
+    }
+    downloadTool(javaRelease) {
+        return __awaiter(this, void 0, void 0, function* () {
+            throw new Error('This method should not be implemented in local file provider');
+        });
+    }
+}
+exports.LocalDistribution = LocalDistribution;
 
 
 /***/ }),
@@ -13823,135 +13833,135 @@ exports.XMLCBWriter = XMLCBWriter;
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MicrosoftDistributions = void 0;
-const base_installer_1 = __webpack_require__(83);
-const semver_1 = __importDefault(__webpack_require__(876));
-const util_1 = __webpack_require__(322);
-const core = __importStar(__webpack_require__(470));
-const tc = __importStar(__webpack_require__(139));
-const fs_1 = __importDefault(__webpack_require__(747));
-const path_1 = __importDefault(__webpack_require__(622));
-class MicrosoftDistributions extends base_installer_1.JavaBase {
-    constructor(installerOptions) {
-        super('Microsoft', installerOptions);
-    }
-    downloadTool(javaRelease) {
-        return __awaiter(this, void 0, void 0, function* () {
-            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
-            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
-            core.info(`Extracting Java archive...`);
-            const extension = util_1.getDownloadArchiveExtension();
-            const extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
-            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
-            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
-            const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
-            return { version: javaRelease.version, path: javaPath };
-        });
-    }
-    findPackageForDownload(range) {
-        return __awaiter(this, void 0, void 0, function* () {
-            if (this.architecture !== 'x64' && this.architecture !== 'aarch64') {
-                throw new Error(`Unsupported architecture: ${this.architecture}`);
-            }
-            if (!this.stable) {
-                throw new Error('Early access versions are not supported');
-            }
-            if (this.packageType !== 'jdk') {
-                throw new Error('Microsoft Build of OpenJDK provides only the `jdk` package type');
-            }
-            const availableVersionsRaw = yield this.getAvailableVersions();
-            const opts = this.getPlatformOption();
-            const availableVersions = availableVersionsRaw.map(item => ({
-                url: `https://aka.ms/download-jdk/microsoft-jdk-${item.version.join('.')}-${opts.os}-${this.architecture}.${opts.archive}`,
-                version: this.convertVersionToSemver(item)
-            }));
-            const satisfiedVersion = availableVersions
-                .filter(item => util_1.isVersionSatisfies(range, item.version))
-                .sort((a, b) => -semver_1.default.compareBuild(a.version, b.version))[0];
-            if (!satisfiedVersion) {
-                const availableOptions = availableVersions.map(item => item.version).join(', ');
-                const availableOptionsMessage = availableOptions
-                    ? `\nAvailable versions: ${availableOptions}`
-                    : '';
-                throw new Error(`Could not find satisfied version for SemVer ${range}. ${availableOptionsMessage}`);
-            }
-            return satisfiedVersion;
-        });
-    }
-    getAvailableVersions() {
-        return __awaiter(this, void 0, void 0, function* () {
-            // TODO get these dynamically!
-            // We will need Microsoft to add an endpoint where we can query for versions.
-            const jdkVersions = [
-                {
-                    version: [17, 0, 1, 12, 1]
-                },
-                {
-                    version: [16, 0, 2, 7, 1]
-                }
-            ];
-            // M1 is only supported for Java 16 & 17
-            if (process.platform !== 'darwin' || this.architecture !== 'aarch64') {
-                jdkVersions.push({
-                    version: [11, 0, 13, 8, 1]
-                });
-            }
-            return jdkVersions;
-        });
-    }
-    getPlatformOption(platform = process.platform /* for testing */) {
-        switch (platform) {
-            case 'darwin':
-                return { archive: 'tar.gz', os: 'macos' };
-            case 'win32':
-                return { archive: 'zip', os: 'windows' };
-            case 'linux':
-                return { archive: 'tar.gz', os: 'linux' };
-            default:
-                throw new Error(`Platform '${platform}' is not supported. Supported platforms: 'darwin', 'linux', 'win32'`);
-        }
-    }
-    convertVersionToSemver(version) {
-        const major = version.version[0];
-        const minor = version.version[1];
-        const patch = version.version[2];
-        return `${major}.${minor}.${patch}`;
-    }
-}
-exports.MicrosoftDistributions = MicrosoftDistributions;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MicrosoftDistributions = void 0;
+const base_installer_1 = __webpack_require__(83);
+const semver_1 = __importDefault(__webpack_require__(876));
+const util_1 = __webpack_require__(322);
+const core = __importStar(__webpack_require__(470));
+const tc = __importStar(__webpack_require__(139));
+const fs_1 = __importDefault(__webpack_require__(747));
+const path_1 = __importDefault(__webpack_require__(622));
+class MicrosoftDistributions extends base_installer_1.JavaBase {
+    constructor(installerOptions) {
+        super('Microsoft', installerOptions);
+    }
+    downloadTool(javaRelease) {
+        return __awaiter(this, void 0, void 0, function* () {
+            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
+            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
+            core.info(`Extracting Java archive...`);
+            const extension = util_1.getDownloadArchiveExtension();
+            const extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
+            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
+            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
+            const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
+            return { version: javaRelease.version, path: javaPath };
+        });
+    }
+    findPackageForDownload(range) {
+        return __awaiter(this, void 0, void 0, function* () {
+            if (this.architecture !== 'x64' && this.architecture !== 'aarch64') {
+                throw new Error(`Unsupported architecture: ${this.architecture}`);
+            }
+            if (!this.stable) {
+                throw new Error('Early access versions are not supported');
+            }
+            if (this.packageType !== 'jdk') {
+                throw new Error('Microsoft Build of OpenJDK provides only the `jdk` package type');
+            }
+            const availableVersionsRaw = yield this.getAvailableVersions();
+            const opts = this.getPlatformOption();
+            const availableVersions = availableVersionsRaw.map(item => ({
+                url: `https://aka.ms/download-jdk/microsoft-jdk-${item.version.join('.')}-${opts.os}-${this.architecture}.${opts.archive}`,
+                version: this.convertVersionToSemver(item)
+            }));
+            const satisfiedVersion = availableVersions
+                .filter(item => util_1.isVersionSatisfies(range, item.version))
+                .sort((a, b) => -semver_1.default.compareBuild(a.version, b.version))[0];
+            if (!satisfiedVersion) {
+                const availableOptions = availableVersions.map(item => item.version).join(', ');
+                const availableOptionsMessage = availableOptions
+                    ? `\nAvailable versions: ${availableOptions}`
+                    : '';
+                throw new Error(`Could not find satisfied version for SemVer ${range}. ${availableOptionsMessage}`);
+            }
+            return satisfiedVersion;
+        });
+    }
+    getAvailableVersions() {
+        return __awaiter(this, void 0, void 0, function* () {
+            // TODO get these dynamically!
+            // We will need Microsoft to add an endpoint where we can query for versions.
+            const jdkVersions = [
+                {
+                    version: [17, 0, 1, 12, 1]
+                },
+                {
+                    version: [16, 0, 2, 7, 1]
+                }
+            ];
+            // M1 is only supported for Java 16 & 17
+            if (process.platform !== 'darwin' || this.architecture !== 'aarch64') {
+                jdkVersions.push({
+                    version: [11, 0, 13, 8, 1]
+                });
+            }
+            return jdkVersions;
+        });
+    }
+    getPlatformOption(platform = process.platform /* for testing */) {
+        switch (platform) {
+            case 'darwin':
+                return { archive: 'tar.gz', os: 'macos' };
+            case 'win32':
+                return { archive: 'zip', os: 'windows' };
+            case 'linux':
+                return { archive: 'tar.gz', os: 'linux' };
+            default:
+                throw new Error(`Platform '${platform}' is not supported. Supported platforms: 'darwin', 'linux', 'win32'`);
+        }
+    }
+    convertVersionToSemver(version) {
+        const major = version.version[0];
+        const minor = version.version[1];
+        const patch = version.version[2];
+        return `${major}.${minor}.${patch}`;
+    }
+}
+exports.MicrosoftDistributions = MicrosoftDistributions;
 
 
 /***/ }),
@@ -14225,28 +14235,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
 /***/ (function(__unusedmodule, exports) {
 
 "use strict";
-
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = 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 = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
-exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
-exports.INPUT_JAVA_VERSION = 'java-version';
-exports.INPUT_ARCHITECTURE = 'architecture';
-exports.INPUT_JAVA_PACKAGE = 'java-package';
-exports.INPUT_DISTRIBUTION = 'distribution';
-exports.INPUT_JDK_FILE = 'jdkFile';
-exports.INPUT_CHECK_LATEST = 'check-latest';
-exports.INPUT_SERVER_ID = 'server-id';
-exports.INPUT_SERVER_USERNAME = 'server-username';
-exports.INPUT_SERVER_PASSWORD = 'server-password';
-exports.INPUT_SETTINGS_PATH = 'settings-path';
-exports.INPUT_OVERWRITE_SETTINGS = 'overwrite-settings';
-exports.INPUT_GPG_PRIVATE_KEY = 'gpg-private-key';
-exports.INPUT_GPG_PASSPHRASE = 'gpg-passphrase';
-exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined;
-exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
-exports.INPUT_CACHE = 'cache';
-exports.INPUT_JOB_STATUS = 'job-status';
-exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
+
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = 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 = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
+exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
+exports.INPUT_JAVA_VERSION = 'java-version';
+exports.INPUT_ARCHITECTURE = 'architecture';
+exports.INPUT_JAVA_PACKAGE = 'java-package';
+exports.INPUT_DISTRIBUTION = 'distribution';
+exports.INPUT_JDK_FILE = 'jdkFile';
+exports.INPUT_CHECK_LATEST = 'check-latest';
+exports.INPUT_SERVER_ID = 'server-id';
+exports.INPUT_SERVER_USERNAME = 'server-username';
+exports.INPUT_SERVER_PASSWORD = 'server-password';
+exports.INPUT_SETTINGS_PATH = 'settings-path';
+exports.INPUT_OVERWRITE_SETTINGS = 'overwrite-settings';
+exports.INPUT_GPG_PRIVATE_KEY = 'gpg-private-key';
+exports.INPUT_GPG_PASSPHRASE = 'gpg-passphrase';
+exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined;
+exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
+exports.INPUT_CACHE = 'cache';
+exports.INPUT_JOB_STATUS = 'job-status';
+exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
 
 
 /***/ }),
@@ -18568,160 +18578,160 @@ module.exports = satisfies
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-/**
- * @fileoverview this file provides methods handling dependency cache
- */
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.save = exports.restore = void 0;
-const path_1 = __webpack_require__(622);
-const os_1 = __importDefault(__webpack_require__(87));
-const cache = __importStar(__webpack_require__(692));
-const core = __importStar(__webpack_require__(470));
-const glob = __importStar(__webpack_require__(281));
-const STATE_CACHE_PRIMARY_KEY = 'cache-primary-key';
-const CACHE_MATCHED_KEY = 'cache-matched-key';
-const CACHE_KEY_PREFIX = 'setup-java';
-const supportedPackageManager = [
-    {
-        id: 'maven',
-        path: [path_1.join(os_1.default.homedir(), '.m2', 'repository')],
-        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---maven
-        pattern: ['**/pom.xml']
-    },
-    {
-        id: 'gradle',
-        path: [path_1.join(os_1.default.homedir(), '.gradle', 'caches'), path_1.join(os_1.default.homedir(), '.gradle', 'wrapper')],
-        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle
-        pattern: ['**/*.gradle*', '**/gradle-wrapper.properties']
-    }
-];
-function findPackageManager(id) {
-    const packageManager = supportedPackageManager.find(packageManager => packageManager.id === id);
-    if (packageManager === undefined) {
-        throw new Error(`unknown package manager specified: ${id}`);
-    }
-    return packageManager;
-}
-/**
- * A function that generates a cache key to use.
- * Format of the generated key will be "${{ platform }}-${{ id }}-${{ fileHash }}"".
- * If there is no file matched to {@link PackageManager.path}, the generated key ends with a dash (-).
- * @see {@link https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows#matching-a-cache-key|spec of cache key}
- */
-function computeCacheKey(packageManager) {
-    return __awaiter(this, void 0, void 0, function* () {
-        const hash = yield glob.hashFiles(packageManager.pattern.join('\n'));
-        return `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${packageManager.id}-${hash}`;
-    });
-}
-/**
- * Restore the dependency cache
- * @param id ID of the package manager, should be "maven" or "gradle"
- */
-function restore(id) {
-    return __awaiter(this, void 0, void 0, function* () {
-        const packageManager = findPackageManager(id);
-        const primaryKey = yield computeCacheKey(packageManager);
-        core.debug(`primary key is ${primaryKey}`);
-        core.saveState(STATE_CACHE_PRIMARY_KEY, primaryKey);
-        if (primaryKey.endsWith('-')) {
-            throw new Error(`No file in ${process.cwd()} matched to [${packageManager.pattern}], make sure you have checked out the target repository`);
-        }
-        const matchedKey = yield cache.restoreCache(packageManager.path, primaryKey, [
-            `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${id}`
-        ]);
-        if (matchedKey) {
-            core.saveState(CACHE_MATCHED_KEY, matchedKey);
-            core.info(`Cache restored from key: ${matchedKey}`);
-        }
-        else {
-            core.info(`${packageManager.id} cache is not found`);
-        }
-    });
-}
-exports.restore = restore;
-/**
- * Save the dependency cache
- * @param id ID of the package manager, should be "maven" or "gradle"
- */
-function save(id) {
-    return __awaiter(this, void 0, void 0, function* () {
-        const packageManager = findPackageManager(id);
-        const matchedKey = core.getState(CACHE_MATCHED_KEY);
-        // Inputs are re-evaluted before the post action, so we want the original key used for restore
-        const primaryKey = core.getState(STATE_CACHE_PRIMARY_KEY);
-        if (!primaryKey) {
-            core.warning('Error retrieving key from state.');
-            return;
-        }
-        else if (matchedKey === primaryKey) {
-            // no change in target directories
-            core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
-            return;
-        }
-        try {
-            yield cache.saveCache(packageManager.path, primaryKey);
-            core.info(`Cache saved with the key: ${primaryKey}`);
-        }
-        catch (error) {
-            if (error.name === cache.ReserveCacheError.name) {
-                core.info(error.message);
-            }
-            else {
-                if (isProbablyGradleDaemonProblem(packageManager, error)) {
-                    core.warning('Failed to save Gradle cache on Windows. If tar.exe reported "Permission denied", try to run Gradle with `--no-daemon` option. Refer to https://github.com/actions/cache/issues/454 for details.');
-                }
-                throw error;
-            }
-        }
-    });
-}
-exports.save = save;
-/**
- * @param packageManager the specified package manager by user
- * @param error the error thrown by the saveCache
- * @returns true if the given error seems related to the {@link https://github.com/actions/cache/issues/454|running Gradle Daemon issue}.
- * @see {@link https://github.com/actions/cache/issues/454#issuecomment-840493935|why --no-daemon is necessary}
- */
-function isProbablyGradleDaemonProblem(packageManager, error) {
-    if (packageManager.id !== 'gradle' || process.env['RUNNER_OS'] !== 'Windows') {
-        return false;
-    }
-    const message = error.message || '';
-    return message.startsWith('Tar failed with error: ');
-}
+
+/**
+ * @fileoverview this file provides methods handling dependency cache
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.save = exports.restore = void 0;
+const path_1 = __webpack_require__(622);
+const os_1 = __importDefault(__webpack_require__(87));
+const cache = __importStar(__webpack_require__(692));
+const core = __importStar(__webpack_require__(470));
+const glob = __importStar(__webpack_require__(281));
+const STATE_CACHE_PRIMARY_KEY = 'cache-primary-key';
+const CACHE_MATCHED_KEY = 'cache-matched-key';
+const CACHE_KEY_PREFIX = 'setup-java';
+const supportedPackageManager = [
+    {
+        id: 'maven',
+        path: [path_1.join(os_1.default.homedir(), '.m2', 'repository')],
+        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---maven
+        pattern: ['**/pom.xml']
+    },
+    {
+        id: 'gradle',
+        path: [path_1.join(os_1.default.homedir(), '.gradle', 'caches'), path_1.join(os_1.default.homedir(), '.gradle', 'wrapper')],
+        // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle
+        pattern: ['**/*.gradle*', '**/gradle-wrapper.properties']
+    }
+];
+function findPackageManager(id) {
+    const packageManager = supportedPackageManager.find(packageManager => packageManager.id === id);
+    if (packageManager === undefined) {
+        throw new Error(`unknown package manager specified: ${id}`);
+    }
+    return packageManager;
+}
+/**
+ * A function that generates a cache key to use.
+ * Format of the generated key will be "${{ platform }}-${{ id }}-${{ fileHash }}"".
+ * If there is no file matched to {@link PackageManager.path}, the generated key ends with a dash (-).
+ * @see {@link https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows#matching-a-cache-key|spec of cache key}
+ */
+function computeCacheKey(packageManager) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const hash = yield glob.hashFiles(packageManager.pattern.join('\n'));
+        return `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${packageManager.id}-${hash}`;
+    });
+}
+/**
+ * Restore the dependency cache
+ * @param id ID of the package manager, should be "maven" or "gradle"
+ */
+function restore(id) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const packageManager = findPackageManager(id);
+        const primaryKey = yield computeCacheKey(packageManager);
+        core.debug(`primary key is ${primaryKey}`);
+        core.saveState(STATE_CACHE_PRIMARY_KEY, primaryKey);
+        if (primaryKey.endsWith('-')) {
+            throw new Error(`No file in ${process.cwd()} matched to [${packageManager.pattern}], make sure you have checked out the target repository`);
+        }
+        const matchedKey = yield cache.restoreCache(packageManager.path, primaryKey, [
+            `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${id}`
+        ]);
+        if (matchedKey) {
+            core.saveState(CACHE_MATCHED_KEY, matchedKey);
+            core.info(`Cache restored from key: ${matchedKey}`);
+        }
+        else {
+            core.info(`${packageManager.id} cache is not found`);
+        }
+    });
+}
+exports.restore = restore;
+/**
+ * Save the dependency cache
+ * @param id ID of the package manager, should be "maven" or "gradle"
+ */
+function save(id) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const packageManager = findPackageManager(id);
+        const matchedKey = core.getState(CACHE_MATCHED_KEY);
+        // Inputs are re-evaluted before the post action, so we want the original key used for restore
+        const primaryKey = core.getState(STATE_CACHE_PRIMARY_KEY);
+        if (!primaryKey) {
+            core.warning('Error retrieving key from state.');
+            return;
+        }
+        else if (matchedKey === primaryKey) {
+            // no change in target directories
+            core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
+            return;
+        }
+        try {
+            yield cache.saveCache(packageManager.path, primaryKey);
+            core.info(`Cache saved with the key: ${primaryKey}`);
+        }
+        catch (error) {
+            if (error.name === cache.ReserveCacheError.name) {
+                core.info(error.message);
+            }
+            else {
+                if (isProbablyGradleDaemonProblem(packageManager, error)) {
+                    core.warning('Failed to save Gradle cache on Windows. If tar.exe reported "Permission denied", try to run Gradle with `--no-daemon` option. Refer to https://github.com/actions/cache/issues/454 for details.');
+                }
+                throw error;
+            }
+        }
+    });
+}
+exports.save = save;
+/**
+ * @param packageManager the specified package manager by user
+ * @param error the error thrown by the saveCache
+ * @returns true if the given error seems related to the {@link https://github.com/actions/cache/issues/454|running Gradle Daemon issue}.
+ * @see {@link https://github.com/actions/cache/issues/454#issuecomment-840493935|why --no-daemon is necessary}
+ */
+function isProbablyGradleDaemonProblem(packageManager, error) {
+    if (packageManager.id !== 'gradle' || process.env['RUNNER_OS'] !== 'Windows') {
+        return false;
+    }
+    const message = error.message || '';
+    return message.startsWith('Tar failed with error: ');
+}
 
 
 /***/ }),
@@ -18731,116 +18741,116 @@ function isProbablyGradleDaemonProblem(packageManager, error) {
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
-const os_1 = __importDefault(__webpack_require__(87));
-const path_1 = __importDefault(__webpack_require__(622));
-const fs = __importStar(__webpack_require__(747));
-const semver = __importStar(__webpack_require__(876));
-const core = __importStar(__webpack_require__(470));
-const tc = __importStar(__webpack_require__(139));
-const constants_1 = __webpack_require__(211);
-function getTempDir() {
-    let tempDirectory = process.env['RUNNER_TEMP'] || os_1.default.tmpdir();
-    return tempDirectory;
-}
-exports.getTempDir = getTempDir;
-function getBooleanInput(inputName, defaultValue = false) {
-    return (core.getInput(inputName) || String(defaultValue)).toUpperCase() === 'TRUE';
-}
-exports.getBooleanInput = getBooleanInput;
-function getVersionFromToolcachePath(toolPath) {
-    if (toolPath) {
-        return path_1.default.basename(path_1.default.dirname(toolPath));
-    }
-    return toolPath;
-}
-exports.getVersionFromToolcachePath = getVersionFromToolcachePath;
-function extractJdkFile(toolPath, extension) {
-    return __awaiter(this, void 0, void 0, function* () {
-        if (!extension) {
-            extension = toolPath.endsWith('.tar.gz') ? 'tar.gz' : path_1.default.extname(toolPath);
-            if (extension.startsWith('.')) {
-                extension = extension.substring(1);
-            }
-        }
-        switch (extension) {
-            case 'tar.gz':
-            case 'tar':
-                return yield tc.extractTar(toolPath);
-            case 'zip':
-                return yield tc.extractZip(toolPath);
-            default:
-                return yield tc.extract7z(toolPath);
-        }
-    });
-}
-exports.extractJdkFile = extractJdkFile;
-function getDownloadArchiveExtension() {
-    return process.platform === 'win32' ? 'zip' : 'tar.gz';
-}
-exports.getDownloadArchiveExtension = getDownloadArchiveExtension;
-function isVersionSatisfies(range, version) {
-    var _a;
-    if (semver.valid(range)) {
-        // if full version with build digit is provided as a range (such as '1.2.3+4')
-        // we should check for exact equal via compareBuild
-        // since semver.satisfies doesn't handle 4th digit
-        const semRange = semver.parse(range);
-        if (semRange && ((_a = semRange.build) === null || _a === void 0 ? void 0 : _a.length) > 0) {
-            return semver.compareBuild(range, version) === 0;
-        }
-    }
-    return semver.satisfies(version, range);
-}
-exports.isVersionSatisfies = isVersionSatisfies;
-function getToolcachePath(toolName, version, architecture) {
-    var _a;
-    const toolcacheRoot = (_a = process.env['RUNNER_TOOL_CACHE']) !== null && _a !== void 0 ? _a : '';
-    const fullPath = path_1.default.join(toolcacheRoot, toolName, version, architecture);
-    if (fs.existsSync(fullPath)) {
-        return fullPath;
-    }
-    return null;
-}
-exports.getToolcachePath = getToolcachePath;
-function isJobStatusSuccess() {
-    const jobStatus = core.getInput(constants_1.INPUT_JOB_STATUS);
-    return jobStatus === 'success';
-}
-exports.isJobStatusSuccess = isJobStatusSuccess;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
+const os_1 = __importDefault(__webpack_require__(87));
+const path_1 = __importDefault(__webpack_require__(622));
+const fs = __importStar(__webpack_require__(747));
+const semver = __importStar(__webpack_require__(876));
+const core = __importStar(__webpack_require__(470));
+const tc = __importStar(__webpack_require__(139));
+const constants_1 = __webpack_require__(211);
+function getTempDir() {
+    let tempDirectory = process.env['RUNNER_TEMP'] || os_1.default.tmpdir();
+    return tempDirectory;
+}
+exports.getTempDir = getTempDir;
+function getBooleanInput(inputName, defaultValue = false) {
+    return (core.getInput(inputName) || String(defaultValue)).toUpperCase() === 'TRUE';
+}
+exports.getBooleanInput = getBooleanInput;
+function getVersionFromToolcachePath(toolPath) {
+    if (toolPath) {
+        return path_1.default.basename(path_1.default.dirname(toolPath));
+    }
+    return toolPath;
+}
+exports.getVersionFromToolcachePath = getVersionFromToolcachePath;
+function extractJdkFile(toolPath, extension) {
+    return __awaiter(this, void 0, void 0, function* () {
+        if (!extension) {
+            extension = toolPath.endsWith('.tar.gz') ? 'tar.gz' : path_1.default.extname(toolPath);
+            if (extension.startsWith('.')) {
+                extension = extension.substring(1);
+            }
+        }
+        switch (extension) {
+            case 'tar.gz':
+            case 'tar':
+                return yield tc.extractTar(toolPath);
+            case 'zip':
+                return yield tc.extractZip(toolPath);
+            default:
+                return yield tc.extract7z(toolPath);
+        }
+    });
+}
+exports.extractJdkFile = extractJdkFile;
+function getDownloadArchiveExtension() {
+    return process.platform === 'win32' ? 'zip' : 'tar.gz';
+}
+exports.getDownloadArchiveExtension = getDownloadArchiveExtension;
+function isVersionSatisfies(range, version) {
+    var _a;
+    if (semver.valid(range)) {
+        // if full version with build digit is provided as a range (such as '1.2.3+4')
+        // we should check for exact equal via compareBuild
+        // since semver.satisfies doesn't handle 4th digit
+        const semRange = semver.parse(range);
+        if (semRange && ((_a = semRange.build) === null || _a === void 0 ? void 0 : _a.length) > 0) {
+            return semver.compareBuild(range, version) === 0;
+        }
+    }
+    return semver.satisfies(version, range);
+}
+exports.isVersionSatisfies = isVersionSatisfies;
+function getToolcachePath(toolName, version, architecture) {
+    var _a;
+    const toolcacheRoot = (_a = process.env['RUNNER_TOOL_CACHE']) !== null && _a !== void 0 ? _a : '';
+    const fullPath = path_1.default.join(toolcacheRoot, toolName, version, architecture);
+    if (fs.existsSync(fullPath)) {
+        return fullPath;
+    }
+    return null;
+}
+exports.getToolcachePath = getToolcachePath;
+function isJobStatusSuccess() {
+    const jobStatus = core.getInput(constants_1.INPUT_JOB_STATUS);
+    return jobStatus === 'success';
+}
+exports.isJobStatusSuccess = isJobStatusSuccess;
 
 
 /***/ }),
@@ -24359,132 +24369,132 @@ exports.userAgentPolicy = userAgentPolicy;
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.generate = exports.createAuthenticationSettings = exports.configureAuthentication = exports.SETTINGS_FILE = exports.M2_DIR = void 0;
-const path = __importStar(__webpack_require__(622));
-const core = __importStar(__webpack_require__(470));
-const io = __importStar(__webpack_require__(1));
-const fs = __importStar(__webpack_require__(747));
-const os = __importStar(__webpack_require__(87));
-const xmlbuilder2_1 = __webpack_require__(255);
-const constants = __importStar(__webpack_require__(211));
-const gpg = __importStar(__webpack_require__(884));
-const util_1 = __webpack_require__(322);
-exports.M2_DIR = '.m2';
-exports.SETTINGS_FILE = 'settings.xml';
-function configureAuthentication() {
-    return __awaiter(this, void 0, void 0, function* () {
-        const id = core.getInput(constants.INPUT_SERVER_ID);
-        const username = core.getInput(constants.INPUT_SERVER_USERNAME);
-        const password = core.getInput(constants.INPUT_SERVER_PASSWORD);
-        const settingsDirectory = core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), exports.M2_DIR);
-        const overwriteSettings = util_1.getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
-        const gpgPrivateKey = core.getInput(constants.INPUT_GPG_PRIVATE_KEY) || constants.INPUT_DEFAULT_GPG_PRIVATE_KEY;
-        const gpgPassphrase = core.getInput(constants.INPUT_GPG_PASSPHRASE) ||
-            (gpgPrivateKey ? constants.INPUT_DEFAULT_GPG_PASSPHRASE : undefined);
-        if (gpgPrivateKey) {
-            core.setSecret(gpgPrivateKey);
-        }
-        yield createAuthenticationSettings(id, username, password, settingsDirectory, overwriteSettings, gpgPassphrase);
-        if (gpgPrivateKey) {
-            core.info('Importing private gpg key');
-            const keyFingerprint = (yield gpg.importKey(gpgPrivateKey)) || '';
-            core.saveState(constants.STATE_GPG_PRIVATE_KEY_FINGERPRINT, keyFingerprint);
-        }
-    });
-}
-exports.configureAuthentication = configureAuthentication;
-function createAuthenticationSettings(id, username, password, settingsDirectory, overwriteSettings, gpgPassphrase = undefined) {
-    return __awaiter(this, void 0, void 0, function* () {
-        core.info(`Creating ${exports.SETTINGS_FILE} with server-id: ${id}`);
-        // when an alternate m2 location is specified use only that location (no .m2 directory)
-        // otherwise use the home/.m2/ path
-        yield io.mkdirP(settingsDirectory);
-        yield write(settingsDirectory, generate(id, username, password, gpgPassphrase), overwriteSettings);
-    });
-}
-exports.createAuthenticationSettings = createAuthenticationSettings;
-// only exported for testing purposes
-function generate(id, username, password, gpgPassphrase) {
-    const xmlObj = {
-        settings: {
-            '@xmlns': 'http://maven.apache.org/SETTINGS/1.0.0',
-            '@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
-            '@xsi:schemaLocation': 'http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd',
-            servers: {
-                server: [
-                    {
-                        id: id,
-                        username: `\${env.${username}}`,
-                        password: `\${env.${password}}`
-                    }
-                ]
-            }
-        }
-    };
-    if (gpgPassphrase) {
-        const gpgServer = {
-            id: 'gpg.passphrase',
-            passphrase: `\${env.${gpgPassphrase}}`
-        };
-        xmlObj.settings.servers.server.push(gpgServer);
-    }
-    return xmlbuilder2_1.create(xmlObj).end({
-        headless: true,
-        prettyPrint: true,
-        width: 80
-    });
-}
-exports.generate = generate;
-function write(directory, settings, overwriteSettings) {
-    return __awaiter(this, void 0, void 0, function* () {
-        const location = path.join(directory, exports.SETTINGS_FILE);
-        const settingsExists = fs.existsSync(location);
-        if (settingsExists && overwriteSettings) {
-            core.info(`Overwriting existing file ${location}`);
-        }
-        else if (!settingsExists) {
-            core.info(`Writing to ${location}`);
-        }
-        else {
-            core.info(`Skipping generation ${location} because file already exists and overwriting is not required`);
-            return;
-        }
-        return fs.writeFileSync(location, settings, {
-            encoding: 'utf-8',
-            flag: 'w'
-        });
-    });
-}
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.generate = exports.createAuthenticationSettings = exports.configureAuthentication = exports.SETTINGS_FILE = exports.M2_DIR = void 0;
+const path = __importStar(__webpack_require__(622));
+const core = __importStar(__webpack_require__(470));
+const io = __importStar(__webpack_require__(1));
+const fs = __importStar(__webpack_require__(747));
+const os = __importStar(__webpack_require__(87));
+const xmlbuilder2_1 = __webpack_require__(255);
+const constants = __importStar(__webpack_require__(211));
+const gpg = __importStar(__webpack_require__(884));
+const util_1 = __webpack_require__(322);
+exports.M2_DIR = '.m2';
+exports.SETTINGS_FILE = 'settings.xml';
+function configureAuthentication() {
+    return __awaiter(this, void 0, void 0, function* () {
+        const id = core.getInput(constants.INPUT_SERVER_ID);
+        const username = core.getInput(constants.INPUT_SERVER_USERNAME);
+        const password = core.getInput(constants.INPUT_SERVER_PASSWORD);
+        const settingsDirectory = core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), exports.M2_DIR);
+        const overwriteSettings = util_1.getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
+        const gpgPrivateKey = core.getInput(constants.INPUT_GPG_PRIVATE_KEY) || constants.INPUT_DEFAULT_GPG_PRIVATE_KEY;
+        const gpgPassphrase = core.getInput(constants.INPUT_GPG_PASSPHRASE) ||
+            (gpgPrivateKey ? constants.INPUT_DEFAULT_GPG_PASSPHRASE : undefined);
+        if (gpgPrivateKey) {
+            core.setSecret(gpgPrivateKey);
+        }
+        yield createAuthenticationSettings(id, username, password, settingsDirectory, overwriteSettings, gpgPassphrase);
+        if (gpgPrivateKey) {
+            core.info('Importing private gpg key');
+            const keyFingerprint = (yield gpg.importKey(gpgPrivateKey)) || '';
+            core.saveState(constants.STATE_GPG_PRIVATE_KEY_FINGERPRINT, keyFingerprint);
+        }
+    });
+}
+exports.configureAuthentication = configureAuthentication;
+function createAuthenticationSettings(id, username, password, settingsDirectory, overwriteSettings, gpgPassphrase = undefined) {
+    return __awaiter(this, void 0, void 0, function* () {
+        core.info(`Creating ${exports.SETTINGS_FILE} with server-id: ${id}`);
+        // when an alternate m2 location is specified use only that location (no .m2 directory)
+        // otherwise use the home/.m2/ path
+        yield io.mkdirP(settingsDirectory);
+        yield write(settingsDirectory, generate(id, username, password, gpgPassphrase), overwriteSettings);
+    });
+}
+exports.createAuthenticationSettings = createAuthenticationSettings;
+// only exported for testing purposes
+function generate(id, username, password, gpgPassphrase) {
+    const xmlObj = {
+        settings: {
+            '@xmlns': 'http://maven.apache.org/SETTINGS/1.0.0',
+            '@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
+            '@xsi:schemaLocation': 'http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd',
+            servers: {
+                server: [
+                    {
+                        id: id,
+                        username: `\${env.${username}}`,
+                        password: `\${env.${password}}`
+                    }
+                ]
+            }
+        }
+    };
+    if (gpgPassphrase) {
+        const gpgServer = {
+            id: 'gpg.passphrase',
+            passphrase: `\${env.${gpgPassphrase}}`
+        };
+        xmlObj.settings.servers.server.push(gpgServer);
+    }
+    return xmlbuilder2_1.create(xmlObj).end({
+        headless: true,
+        prettyPrint: true,
+        width: 80
+    });
+}
+exports.generate = generate;
+function write(directory, settings, overwriteSettings) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const location = path.join(directory, exports.SETTINGS_FILE);
+        const settingsExists = fs.existsSync(location);
+        if (settingsExists && overwriteSettings) {
+            core.info(`Overwriting existing file ${location}`);
+        }
+        else if (!settingsExists) {
+            core.info(`Writing to ${location}`);
+        }
+        else {
+            core.info(`Skipping generation ${location} because file already exists and overwriting is not required`);
+            return;
+        }
+        return fs.writeFileSync(location, settings, {
+            encoding: 'utf-8',
+            flag: 'w'
+        });
+    });
+}
 
 
 /***/ }),
@@ -28685,168 +28695,168 @@ exports.NonRecordingSpan = NonRecordingSpan;
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TemurinDistribution = exports.TemurinImplementation = void 0;
-const core = __importStar(__webpack_require__(470));
-const tc = __importStar(__webpack_require__(139));
-const fs_1 = __importDefault(__webpack_require__(747));
-const path_1 = __importDefault(__webpack_require__(622));
-const semver_1 = __importDefault(__webpack_require__(876));
-const base_installer_1 = __webpack_require__(83);
-const util_1 = __webpack_require__(322);
-var TemurinImplementation;
-(function (TemurinImplementation) {
-    TemurinImplementation["Hotspot"] = "Hotspot";
-})(TemurinImplementation = exports.TemurinImplementation || (exports.TemurinImplementation = {}));
-class TemurinDistribution extends base_installer_1.JavaBase {
-    constructor(installerOptions, jvmImpl) {
-        super(`Temurin-${jvmImpl}`, installerOptions);
-        this.jvmImpl = jvmImpl;
-    }
-    findPackageForDownload(version) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const availableVersionsRaw = yield this.getAvailableVersions();
-            const availableVersionsWithBinaries = availableVersionsRaw
-                .filter(item => item.binaries.length > 0)
-                .map(item => {
-                // normalize 17.0.0-beta+33.0.202107301459 to 17.0.0+33.0.202107301459 for earlier access versions
-                const formattedVersion = this.stable
-                    ? item.version_data.semver
-                    : item.version_data.semver.replace('-beta+', '+');
-                return {
-                    version: formattedVersion,
-                    url: item.binaries[0].package.link
-                };
-            });
-            const satisfiedVersions = availableVersionsWithBinaries
-                .filter(item => util_1.isVersionSatisfies(version, item.version))
-                .sort((a, b) => {
-                return -semver_1.default.compareBuild(a.version, b.version);
-            });
-            const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null;
-            if (!resolvedFullVersion) {
-                const availableOptions = availableVersionsWithBinaries.map(item => item.version).join(', ');
-                const availableOptionsMessage = availableOptions
-                    ? `\nAvailable versions: ${availableOptions}`
-                    : '';
-                throw new Error(`Could not find satisfied version for SemVer '${version}'. ${availableOptionsMessage}`);
-            }
-            return resolvedFullVersion;
-        });
-    }
-    downloadTool(javaRelease) {
-        return __awaiter(this, void 0, void 0, function* () {
-            let javaPath;
-            let extractedJavaPath;
-            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
-            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
-            core.info(`Extracting Java archive...`);
-            let extension = util_1.getDownloadArchiveExtension();
-            extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
-            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
-            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
-            const version = this.getToolcacheVersionName(javaRelease.version);
-            javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture);
-            return { version: javaRelease.version, path: javaPath };
-        });
-    }
-    get toolcacheFolderName() {
-        return super.toolcacheFolderName;
-    }
-    getAvailableVersions() {
-        return __awaiter(this, void 0, void 0, function* () {
-            const platform = this.getPlatformOption();
-            const arch = this.architecture;
-            const imageType = this.packageType;
-            const versionRange = encodeURI('[1.0,100.0]'); // retrieve all available versions
-            const releaseType = this.stable ? 'ga' : 'ea';
-            console.time('temurin-retrieve-available-versions');
-            const baseRequestArguments = [
-                `project=jdk`,
-                'vendor=adoptium',
-                `heap_size=normal`,
-                'sort_method=DEFAULT',
-                'sort_order=DESC',
-                `os=${platform}`,
-                `architecture=${arch}`,
-                `image_type=${imageType}`,
-                `release_type=${releaseType}`,
-                `jvm_impl=${this.jvmImpl.toLowerCase()}`
-            ].join('&');
-            // need to iterate through all pages to retrieve the list of all versions
-            // Adoptium API doesn't provide way to retrieve the count of pages to iterate so infinity loop
-            let page_index = 0;
-            const availableVersions = [];
-            while (true) {
-                const requestArguments = `${baseRequestArguments}&page_size=20&page=${page_index}`;
-                const availableVersionsUrl = `https://api.adoptium.net/v3/assets/version/${versionRange}?${requestArguments}`;
-                if (core.isDebug() && page_index === 0) {
-                    // url is identical except page_index so print it once for debug
-                    core.debug(`Gathering available versions from '${availableVersionsUrl}'`);
-                }
-                const paginationPage = (yield this.http.getJson(availableVersionsUrl)).result;
-                if (paginationPage === null || paginationPage.length === 0) {
-                    // break infinity loop because we have reached end of pagination
-                    break;
-                }
-                availableVersions.push(...paginationPage);
-                page_index++;
-            }
-            if (core.isDebug()) {
-                core.startGroup('Print information about available versions');
-                console.timeEnd('temurin-retrieve-available-versions');
-                console.log(`Available versions: [${availableVersions.length}]`);
-                console.log(availableVersions.map(item => item.version_data.semver).join(', '));
-                core.endGroup();
-            }
-            return availableVersions;
-        });
-    }
-    getPlatformOption() {
-        // Adoptium has own platform names so need to map them
-        switch (process.platform) {
-            case 'darwin':
-                return 'mac';
-            case 'win32':
-                return 'windows';
-            default:
-                return process.platform;
-        }
-    }
-}
-exports.TemurinDistribution = TemurinDistribution;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TemurinDistribution = exports.TemurinImplementation = void 0;
+const core = __importStar(__webpack_require__(470));
+const tc = __importStar(__webpack_require__(139));
+const fs_1 = __importDefault(__webpack_require__(747));
+const path_1 = __importDefault(__webpack_require__(622));
+const semver_1 = __importDefault(__webpack_require__(876));
+const base_installer_1 = __webpack_require__(83);
+const util_1 = __webpack_require__(322);
+var TemurinImplementation;
+(function (TemurinImplementation) {
+    TemurinImplementation["Hotspot"] = "Hotspot";
+})(TemurinImplementation = exports.TemurinImplementation || (exports.TemurinImplementation = {}));
+class TemurinDistribution extends base_installer_1.JavaBase {
+    constructor(installerOptions, jvmImpl) {
+        super(`Temurin-${jvmImpl}`, installerOptions);
+        this.jvmImpl = jvmImpl;
+    }
+    findPackageForDownload(version) {
+        return __awaiter(this, void 0, void 0, function* () {
+            const availableVersionsRaw = yield this.getAvailableVersions();
+            const availableVersionsWithBinaries = availableVersionsRaw
+                .filter(item => item.binaries.length > 0)
+                .map(item => {
+                // normalize 17.0.0-beta+33.0.202107301459 to 17.0.0+33.0.202107301459 for earlier access versions
+                const formattedVersion = this.stable
+                    ? item.version_data.semver
+                    : item.version_data.semver.replace('-beta+', '+');
+                return {
+                    version: formattedVersion,
+                    url: item.binaries[0].package.link
+                };
+            });
+            const satisfiedVersions = availableVersionsWithBinaries
+                .filter(item => util_1.isVersionSatisfies(version, item.version))
+                .sort((a, b) => {
+                return -semver_1.default.compareBuild(a.version, b.version);
+            });
+            const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null;
+            if (!resolvedFullVersion) {
+                const availableOptions = availableVersionsWithBinaries.map(item => item.version).join(', ');
+                const availableOptionsMessage = availableOptions
+                    ? `\nAvailable versions: ${availableOptions}`
+                    : '';
+                throw new Error(`Could not find satisfied version for SemVer '${version}'. ${availableOptionsMessage}`);
+            }
+            return resolvedFullVersion;
+        });
+    }
+    downloadTool(javaRelease) {
+        return __awaiter(this, void 0, void 0, function* () {
+            let javaPath;
+            let extractedJavaPath;
+            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
+            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
+            core.info(`Extracting Java archive...`);
+            let extension = util_1.getDownloadArchiveExtension();
+            extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
+            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
+            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
+            const version = this.getToolcacheVersionName(javaRelease.version);
+            javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture);
+            return { version: javaRelease.version, path: javaPath };
+        });
+    }
+    get toolcacheFolderName() {
+        return super.toolcacheFolderName;
+    }
+    getAvailableVersions() {
+        return __awaiter(this, void 0, void 0, function* () {
+            const platform = this.getPlatformOption();
+            const arch = this.architecture;
+            const imageType = this.packageType;
+            const versionRange = encodeURI('[1.0,100.0]'); // retrieve all available versions
+            const releaseType = this.stable ? 'ga' : 'ea';
+            console.time('temurin-retrieve-available-versions');
+            const baseRequestArguments = [
+                `project=jdk`,
+                'vendor=adoptium',
+                `heap_size=normal`,
+                'sort_method=DEFAULT',
+                'sort_order=DESC',
+                `os=${platform}`,
+                `architecture=${arch}`,
+                `image_type=${imageType}`,
+                `release_type=${releaseType}`,
+                `jvm_impl=${this.jvmImpl.toLowerCase()}`
+            ].join('&');
+            // need to iterate through all pages to retrieve the list of all versions
+            // Adoptium API doesn't provide way to retrieve the count of pages to iterate so infinity loop
+            let page_index = 0;
+            const availableVersions = [];
+            while (true) {
+                const requestArguments = `${baseRequestArguments}&page_size=20&page=${page_index}`;
+                const availableVersionsUrl = `https://api.adoptium.net/v3/assets/version/${versionRange}?${requestArguments}`;
+                if (core.isDebug() && page_index === 0) {
+                    // url is identical except page_index so print it once for debug
+                    core.debug(`Gathering available versions from '${availableVersionsUrl}'`);
+                }
+                const paginationPage = (yield this.http.getJson(availableVersionsUrl)).result;
+                if (paginationPage === null || paginationPage.length === 0) {
+                    // break infinity loop because we have reached end of pagination
+                    break;
+                }
+                availableVersions.push(...paginationPage);
+                page_index++;
+            }
+            if (core.isDebug()) {
+                core.startGroup('Print information about available versions');
+                console.timeEnd('temurin-retrieve-available-versions');
+                console.log(`Available versions: [${availableVersions.length}]`);
+                console.log(availableVersions.map(item => item.version_data.semver).join(', '));
+                core.endGroup();
+            }
+            return availableVersions;
+        });
+    }
+    getPlatformOption() {
+        // Adoptium has own platform names so need to map them
+        switch (process.platform) {
+            case 'darwin':
+                return 'mac';
+            case 'win32':
+                return 'windows';
+            default:
+                return process.platform;
+        }
+    }
+}
+exports.TemurinDistribution = TemurinDistribution;
 
 
 /***/ }),
@@ -30687,17 +30697,9 @@ AbortError.prototype = Object.create(Error.prototype);
 AbortError.prototype.constructor = AbortError;
 AbortError.prototype.name = 'AbortError';
 
-const URL$1 = Url.URL || whatwgUrl.URL;
-
 // fix an issue where "PassThrough", "resolve" aren't a named export for node <10
 const PassThrough$1 = Stream.PassThrough;
-
-const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
-	const orig = new URL$1(original).hostname;
-	const dest = new URL$1(destination).hostname;
-
-	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
-};
+const resolve_url = Url.resolve;
 
 /**
  * Fetch function
@@ -30785,19 +30787,7 @@ function fetch(url, opts) {
 				const location = headers.get('Location');
 
 				// HTTP fetch step 5.3
-				let locationURL = null;
-				try {
-					locationURL = location === null ? null : new URL$1(location, request.url).toString();
-				} catch (err) {
-					// error here can only be invalid URL in Location: header
-					// do not throw when options.redirect == manual
-					// let the user extract the errorneous redirect URL
-					if (request.redirect !== 'manual') {
-						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
-						finalize();
-						return;
-					}
-				}
+				const locationURL = location === null ? null : resolve_url(request.url, location);
 
 				// HTTP fetch step 5.5
 				switch (request.redirect) {
@@ -30845,12 +30835,6 @@ function fetch(url, opts) {
 							size: request.size
 						};
 
-						if (!isDomainOrSubdomain(request.url, locationURL)) {
-							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
-								requestOpts.headers.delete(name);
-							}
-						}
-
 						// HTTP-redirect fetch step 9
 						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
 							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
@@ -38433,158 +38417,158 @@ module.exports = clean
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.LibericaDistributions = void 0;
-const base_installer_1 = __webpack_require__(83);
-const semver_1 = __importDefault(__webpack_require__(876));
-const util_1 = __webpack_require__(322);
-const core = __importStar(__webpack_require__(470));
-const tc = __importStar(__webpack_require__(139));
-const fs_1 = __importDefault(__webpack_require__(747));
-const path_1 = __importDefault(__webpack_require__(622));
-const supportedPlatform = `'linux', 'linux-musl', 'macos', 'solaris', 'windows'`;
-const supportedArchitecture = `'x86', 'x64', 'armv7', 'aarch64', 'ppc64le'`;
-class LibericaDistributions extends base_installer_1.JavaBase {
-    constructor(installerOptions) {
-        super('Liberica', installerOptions);
-    }
-    downloadTool(javaRelease) {
-        return __awaiter(this, void 0, void 0, function* () {
-            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
-            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
-            core.info(`Extracting Java archive...`);
-            const extension = util_1.getDownloadArchiveExtension();
-            const extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
-            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
-            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
-            const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
-            return { version: javaRelease.version, path: javaPath };
-        });
-    }
-    findPackageForDownload(range) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const availableVersionsRaw = yield this.getAvailableVersions();
-            const availableVersions = availableVersionsRaw.map(item => ({
-                url: item.downloadUrl,
-                version: this.convertVersionToSemver(item)
-            }));
-            const satisfiedVersion = availableVersions
-                .filter(item => util_1.isVersionSatisfies(range, item.version))
-                .sort((a, b) => -semver_1.default.compareBuild(a.version, b.version))[0];
-            if (!satisfiedVersion) {
-                const availableOptions = availableVersions.map(item => item.version).join(', ');
-                const availableOptionsMessage = availableOptions
-                    ? `\nAvailable versions: ${availableOptions}`
-                    : '';
-                throw new Error(`Could not find satisfied version for semver ${range}. ${availableOptionsMessage}`);
-            }
-            return satisfiedVersion;
-        });
-    }
-    getAvailableVersions() {
-        var _a;
-        return __awaiter(this, void 0, void 0, function* () {
-            console.time('liberica-retrieve-available-versions');
-            const url = this.prepareAvailableVersionsUrl();
-            if (core.isDebug()) {
-                core.debug(`Gathering available versions from '${url}'`);
-            }
-            const availableVersions = (_a = (yield this.http.getJson(url)).result) !== null && _a !== void 0 ? _a : [];
-            if (core.isDebug()) {
-                core.startGroup('Print information about available versions');
-                console.timeEnd('liberica-retrieve-available-versions');
-                console.log(`Available versions: [${availableVersions.length}]`);
-                console.log(availableVersions.map(item => item.version));
-                core.endGroup();
-            }
-            return availableVersions;
-        });
-    }
-    prepareAvailableVersionsUrl() {
-        const urlOptions = Object.assign(Object.assign({ os: this.getPlatformOption(), 'bundle-type': this.getBundleType() }, this.getArchitectureOptions()), { 'build-type': this.stable ? 'all' : 'ea', 'installation-type': 'archive', fields: 'downloadUrl,version,featureVersion,interimVersion,updateVersion,buildVersion' });
-        const searchParams = new URLSearchParams(urlOptions).toString();
-        return `https://api.bell-sw.com/v1/liberica/releases?${searchParams}`;
-    }
-    getBundleType() {
-        const [bundleType, feature] = this.packageType.split('+');
-        if (feature === null || feature === void 0 ? void 0 : feature.includes('fx')) {
-            return bundleType + '-full';
-        }
-        return bundleType;
-    }
-    getArchitectureOptions() {
-        switch (this.architecture) {
-            case 'x86':
-                return { bitness: '32', arch: 'x86' };
-            case 'x64':
-                return { bitness: '64', arch: 'x86' };
-            case 'armv7':
-                return { bitness: '32', arch: 'arm' };
-            case 'aarch64':
-                return { bitness: '64', arch: 'arm' };
-            case 'ppc64le':
-                return { bitness: '64', arch: 'ppc' };
-            default:
-                throw new Error(`Architecture '${this.architecture}' is not supported. Supported architectures: ${supportedArchitecture}`);
-        }
-    }
-    getPlatformOption(platform = process.platform) {
-        switch (platform) {
-            case 'darwin':
-                return 'macos';
-            case 'win32':
-            case 'cygwin':
-                return 'windows';
-            case 'linux':
-                return 'linux';
-            case 'sunos':
-                return 'solaris';
-            default:
-                throw new Error(`Platform '${platform}' is not supported. Supported platforms: ${supportedPlatform}`);
-        }
-    }
-    convertVersionToSemver(version) {
-        let { buildVersion, featureVersion, interimVersion, updateVersion } = version;
-        const mainVersion = [featureVersion, interimVersion, updateVersion].join('.');
-        if (buildVersion != 0) {
-            return `${mainVersion}+${buildVersion}`;
-        }
-        return mainVersion;
-    }
-}
-exports.LibericaDistributions = LibericaDistributions;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.LibericaDistributions = void 0;
+const base_installer_1 = __webpack_require__(83);
+const semver_1 = __importDefault(__webpack_require__(876));
+const util_1 = __webpack_require__(322);
+const core = __importStar(__webpack_require__(470));
+const tc = __importStar(__webpack_require__(139));
+const fs_1 = __importDefault(__webpack_require__(747));
+const path_1 = __importDefault(__webpack_require__(622));
+const supportedPlatform = `'linux', 'linux-musl', 'macos', 'solaris', 'windows'`;
+const supportedArchitecture = `'x86', 'x64', 'armv7', 'aarch64', 'ppc64le'`;
+class LibericaDistributions extends base_installer_1.JavaBase {
+    constructor(installerOptions) {
+        super('Liberica', installerOptions);
+    }
+    downloadTool(javaRelease) {
+        return __awaiter(this, void 0, void 0, function* () {
+            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
+            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
+            core.info(`Extracting Java archive...`);
+            const extension = util_1.getDownloadArchiveExtension();
+            const extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
+            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
+            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
+            const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
+            return { version: javaRelease.version, path: javaPath };
+        });
+    }
+    findPackageForDownload(range) {
+        return __awaiter(this, void 0, void 0, function* () {
+            const availableVersionsRaw = yield this.getAvailableVersions();
+            const availableVersions = availableVersionsRaw.map(item => ({
+                url: item.downloadUrl,
+                version: this.convertVersionToSemver(item)
+            }));
+            const satisfiedVersion = availableVersions
+                .filter(item => util_1.isVersionSatisfies(range, item.version))
+                .sort((a, b) => -semver_1.default.compareBuild(a.version, b.version))[0];
+            if (!satisfiedVersion) {
+                const availableOptions = availableVersions.map(item => item.version).join(', ');
+                const availableOptionsMessage = availableOptions
+                    ? `\nAvailable versions: ${availableOptions}`
+                    : '';
+                throw new Error(`Could not find satisfied version for semver ${range}. ${availableOptionsMessage}`);
+            }
+            return satisfiedVersion;
+        });
+    }
+    getAvailableVersions() {
+        var _a;
+        return __awaiter(this, void 0, void 0, function* () {
+            console.time('liberica-retrieve-available-versions');
+            const url = this.prepareAvailableVersionsUrl();
+            if (core.isDebug()) {
+                core.debug(`Gathering available versions from '${url}'`);
+            }
+            const availableVersions = (_a = (yield this.http.getJson(url)).result) !== null && _a !== void 0 ? _a : [];
+            if (core.isDebug()) {
+                core.startGroup('Print information about available versions');
+                console.timeEnd('liberica-retrieve-available-versions');
+                console.log(`Available versions: [${availableVersions.length}]`);
+                console.log(availableVersions.map(item => item.version));
+                core.endGroup();
+            }
+            return availableVersions;
+        });
+    }
+    prepareAvailableVersionsUrl() {
+        const urlOptions = Object.assign(Object.assign({ os: this.getPlatformOption(), 'bundle-type': this.getBundleType() }, this.getArchitectureOptions()), { 'build-type': this.stable ? 'all' : 'ea', 'installation-type': 'archive', fields: 'downloadUrl,version,featureVersion,interimVersion,updateVersion,buildVersion' });
+        const searchParams = new URLSearchParams(urlOptions).toString();
+        return `https://api.bell-sw.com/v1/liberica/releases?${searchParams}`;
+    }
+    getBundleType() {
+        const [bundleType, feature] = this.packageType.split('+');
+        if (feature === null || feature === void 0 ? void 0 : feature.includes('fx')) {
+            return bundleType + '-full';
+        }
+        return bundleType;
+    }
+    getArchitectureOptions() {
+        switch (this.architecture) {
+            case 'x86':
+                return { bitness: '32', arch: 'x86' };
+            case 'x64':
+                return { bitness: '64', arch: 'x86' };
+            case 'armv7':
+                return { bitness: '32', arch: 'arm' };
+            case 'aarch64':
+                return { bitness: '64', arch: 'arm' };
+            case 'ppc64le':
+                return { bitness: '64', arch: 'ppc' };
+            default:
+                throw new Error(`Architecture '${this.architecture}' is not supported. Supported architectures: ${supportedArchitecture}`);
+        }
+    }
+    getPlatformOption(platform = process.platform) {
+        switch (platform) {
+            case 'darwin':
+                return 'macos';
+            case 'win32':
+            case 'cygwin':
+                return 'windows';
+            case 'linux':
+                return 'linux';
+            case 'sunos':
+                return 'solaris';
+            default:
+                throw new Error(`Platform '${platform}' is not supported. Supported platforms: ${supportedPlatform}`);
+        }
+    }
+    convertVersionToSemver(version) {
+        let { buildVersion, featureVersion, interimVersion, updateVersion } = version;
+        const mainVersion = [featureVersion, interimVersion, updateVersion].join('.');
+        if (buildVersion != 0) {
+            return `${mainVersion}+${buildVersion}`;
+        }
+        return mainVersion;
+    }
+}
+exports.LibericaDistributions = LibericaDistributions;
 
 
 /***/ }),
@@ -44816,170 +44800,170 @@ exports.ShadowRootImpl = ShadowRootImpl;
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.AdoptDistribution = exports.AdoptImplementation = void 0;
-const core = __importStar(__webpack_require__(470));
-const tc = __importStar(__webpack_require__(139));
-const fs_1 = __importDefault(__webpack_require__(747));
-const path_1 = __importDefault(__webpack_require__(622));
-const semver_1 = __importDefault(__webpack_require__(876));
-const base_installer_1 = __webpack_require__(83);
-const util_1 = __webpack_require__(322);
-var AdoptImplementation;
-(function (AdoptImplementation) {
-    AdoptImplementation["Hotspot"] = "Hotspot";
-    AdoptImplementation["OpenJ9"] = "OpenJ9";
-})(AdoptImplementation = exports.AdoptImplementation || (exports.AdoptImplementation = {}));
-class AdoptDistribution extends base_installer_1.JavaBase {
-    constructor(installerOptions, jvmImpl) {
-        super(`Adopt-${jvmImpl}`, installerOptions);
-        this.jvmImpl = jvmImpl;
-    }
-    findPackageForDownload(version) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const availableVersionsRaw = yield this.getAvailableVersions();
-            const availableVersionsWithBinaries = availableVersionsRaw
-                .filter(item => item.binaries.length > 0)
-                .map(item => {
-                return {
-                    version: item.version_data.semver,
-                    url: item.binaries[0].package.link
-                };
-            });
-            const satisfiedVersions = availableVersionsWithBinaries
-                .filter(item => util_1.isVersionSatisfies(version, item.version))
-                .sort((a, b) => {
-                return -semver_1.default.compareBuild(a.version, b.version);
-            });
-            const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null;
-            if (!resolvedFullVersion) {
-                const availableOptions = availableVersionsWithBinaries.map(item => item.version).join(', ');
-                const availableOptionsMessage = availableOptions
-                    ? `\nAvailable versions: ${availableOptions}`
-                    : '';
-                throw new Error(`Could not find satisfied version for SemVer '${version}'. ${availableOptionsMessage}`);
-            }
-            return resolvedFullVersion;
-        });
-    }
-    downloadTool(javaRelease) {
-        return __awaiter(this, void 0, void 0, function* () {
-            let javaPath;
-            let extractedJavaPath;
-            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
-            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
-            core.info(`Extracting Java archive...`);
-            let extension = util_1.getDownloadArchiveExtension();
-            extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
-            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
-            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
-            const version = this.getToolcacheVersionName(javaRelease.version);
-            javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture);
-            return { version: javaRelease.version, path: javaPath };
-        });
-    }
-    get toolcacheFolderName() {
-        if (this.jvmImpl === AdoptImplementation.Hotspot) {
-            // exclude Hotspot postfix from distribution name because Hosted runners have pre-cached Adopt OpenJDK under "Java_Adopt_jdk"
-            // for more information see: https://github.com/actions/setup-java/pull/155#discussion_r610451063
-            return `Java_Adopt_${this.packageType}`;
-        }
-        return super.toolcacheFolderName;
-    }
-    getAvailableVersions() {
-        return __awaiter(this, void 0, void 0, function* () {
-            const platform = this.getPlatformOption();
-            const arch = this.architecture;
-            const imageType = this.packageType;
-            const versionRange = encodeURI('[1.0,100.0]'); // retrieve all available versions
-            const releaseType = this.stable ? 'ga' : 'ea';
-            console.time('adopt-retrieve-available-versions');
-            const baseRequestArguments = [
-                `project=jdk`,
-                'vendor=adoptopenjdk',
-                `heap_size=normal`,
-                'sort_method=DEFAULT',
-                'sort_order=DESC',
-                `os=${platform}`,
-                `architecture=${arch}`,
-                `image_type=${imageType}`,
-                `release_type=${releaseType}`,
-                `jvm_impl=${this.jvmImpl.toLowerCase()}`
-            ].join('&');
-            // need to iterate through all pages to retrieve the list of all versions
-            // Adopt API doesn't provide way to retrieve the count of pages to iterate so infinity loop
-            let page_index = 0;
-            const availableVersions = [];
-            while (true) {
-                const requestArguments = `${baseRequestArguments}&page_size=20&page=${page_index}`;
-                const availableVersionsUrl = `https://api.adoptopenjdk.net/v3/assets/version/${versionRange}?${requestArguments}`;
-                if (core.isDebug() && page_index === 0) {
-                    // url is identical except page_index so print it once for debug
-                    core.debug(`Gathering available versions from '${availableVersionsUrl}'`);
-                }
-                const paginationPage = (yield this.http.getJson(availableVersionsUrl)).result;
-                if (paginationPage === null || paginationPage.length === 0) {
-                    // break infinity loop because we have reached end of pagination
-                    break;
-                }
-                availableVersions.push(...paginationPage);
-                page_index++;
-            }
-            if (core.isDebug()) {
-                core.startGroup('Print information about available versions');
-                console.timeEnd('adopt-retrieve-available-versions');
-                console.log(`Available versions: [${availableVersions.length}]`);
-                console.log(availableVersions.map(item => item.version_data.semver).join(', '));
-                core.endGroup();
-            }
-            return availableVersions;
-        });
-    }
-    getPlatformOption() {
-        // Adopt has own platform names so need to map them
-        switch (process.platform) {
-            case 'darwin':
-                return 'mac';
-            case 'win32':
-                return 'windows';
-            default:
-                return process.platform;
-        }
-    }
-}
-exports.AdoptDistribution = AdoptDistribution;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AdoptDistribution = exports.AdoptImplementation = void 0;
+const core = __importStar(__webpack_require__(470));
+const tc = __importStar(__webpack_require__(139));
+const fs_1 = __importDefault(__webpack_require__(747));
+const path_1 = __importDefault(__webpack_require__(622));
+const semver_1 = __importDefault(__webpack_require__(876));
+const base_installer_1 = __webpack_require__(83);
+const util_1 = __webpack_require__(322);
+var AdoptImplementation;
+(function (AdoptImplementation) {
+    AdoptImplementation["Hotspot"] = "Hotspot";
+    AdoptImplementation["OpenJ9"] = "OpenJ9";
+})(AdoptImplementation = exports.AdoptImplementation || (exports.AdoptImplementation = {}));
+class AdoptDistribution extends base_installer_1.JavaBase {
+    constructor(installerOptions, jvmImpl) {
+        super(`Adopt-${jvmImpl}`, installerOptions);
+        this.jvmImpl = jvmImpl;
+    }
+    findPackageForDownload(version) {
+        return __awaiter(this, void 0, void 0, function* () {
+            const availableVersionsRaw = yield this.getAvailableVersions();
+            const availableVersionsWithBinaries = availableVersionsRaw
+                .filter(item => item.binaries.length > 0)
+                .map(item => {
+                return {
+                    version: item.version_data.semver,
+                    url: item.binaries[0].package.link
+                };
+            });
+            const satisfiedVersions = availableVersionsWithBinaries
+                .filter(item => util_1.isVersionSatisfies(version, item.version))
+                .sort((a, b) => {
+                return -semver_1.default.compareBuild(a.version, b.version);
+            });
+            const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null;
+            if (!resolvedFullVersion) {
+                const availableOptions = availableVersionsWithBinaries.map(item => item.version).join(', ');
+                const availableOptionsMessage = availableOptions
+                    ? `\nAvailable versions: ${availableOptions}`
+                    : '';
+                throw new Error(`Could not find satisfied version for SemVer '${version}'. ${availableOptionsMessage}`);
+            }
+            return resolvedFullVersion;
+        });
+    }
+    downloadTool(javaRelease) {
+        return __awaiter(this, void 0, void 0, function* () {
+            let javaPath;
+            let extractedJavaPath;
+            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
+            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
+            core.info(`Extracting Java archive...`);
+            let extension = util_1.getDownloadArchiveExtension();
+            extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
+            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
+            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
+            const version = this.getToolcacheVersionName(javaRelease.version);
+            javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture);
+            return { version: javaRelease.version, path: javaPath };
+        });
+    }
+    get toolcacheFolderName() {
+        if (this.jvmImpl === AdoptImplementation.Hotspot) {
+            // exclude Hotspot postfix from distribution name because Hosted runners have pre-cached Adopt OpenJDK under "Java_Adopt_jdk"
+            // for more information see: https://github.com/actions/setup-java/pull/155#discussion_r610451063
+            return `Java_Adopt_${this.packageType}`;
+        }
+        return super.toolcacheFolderName;
+    }
+    getAvailableVersions() {
+        return __awaiter(this, void 0, void 0, function* () {
+            const platform = this.getPlatformOption();
+            const arch = this.architecture;
+            const imageType = this.packageType;
+            const versionRange = encodeURI('[1.0,100.0]'); // retrieve all available versions
+            const releaseType = this.stable ? 'ga' : 'ea';
+            console.time('adopt-retrieve-available-versions');
+            const baseRequestArguments = [
+                `project=jdk`,
+                'vendor=adoptopenjdk',
+                `heap_size=normal`,
+                'sort_method=DEFAULT',
+                'sort_order=DESC',
+                `os=${platform}`,
+                `architecture=${arch}`,
+                `image_type=${imageType}`,
+                `release_type=${releaseType}`,
+                `jvm_impl=${this.jvmImpl.toLowerCase()}`
+            ].join('&');
+            // need to iterate through all pages to retrieve the list of all versions
+            // Adopt API doesn't provide way to retrieve the count of pages to iterate so infinity loop
+            let page_index = 0;
+            const availableVersions = [];
+            while (true) {
+                const requestArguments = `${baseRequestArguments}&page_size=20&page=${page_index}`;
+                const availableVersionsUrl = `https://api.adoptopenjdk.net/v3/assets/version/${versionRange}?${requestArguments}`;
+                if (core.isDebug() && page_index === 0) {
+                    // url is identical except page_index so print it once for debug
+                    core.debug(`Gathering available versions from '${availableVersionsUrl}'`);
+                }
+                const paginationPage = (yield this.http.getJson(availableVersionsUrl)).result;
+                if (paginationPage === null || paginationPage.length === 0) {
+                    // break infinity loop because we have reached end of pagination
+                    break;
+                }
+                availableVersions.push(...paginationPage);
+                page_index++;
+            }
+            if (core.isDebug()) {
+                core.startGroup('Print information about available versions');
+                console.timeEnd('adopt-retrieve-available-versions');
+                console.log(`Available versions: [${availableVersions.length}]`);
+                console.log(availableVersions.map(item => item.version_data.semver).join(', '));
+                core.endGroup();
+            }
+            return availableVersions;
+        });
+    }
+    getPlatformOption() {
+        // Adopt has own platform names so need to map them
+        switch (process.platform) {
+            case 'darwin':
+                return 'mac';
+            case 'win32':
+                return 'windows';
+            default:
+                return process.platform;
+        }
+    }
+}
+exports.AdoptDistribution = AdoptDistribution;
 
 
 /***/ }),
@@ -56157,48 +56141,48 @@ exports.SearchState = SearchState;
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getJavaDistribution = void 0;
-const installer_1 = __webpack_require__(144);
-const installer_2 = __webpack_require__(834);
-const installer_3 = __webpack_require__(584);
-const installer_4 = __webpack_require__(439);
-const installer_5 = __webpack_require__(507);
-const installer_6 = __webpack_require__(196);
-var JavaDistribution;
-(function (JavaDistribution) {
-    JavaDistribution["Adopt"] = "adopt";
-    JavaDistribution["AdoptHotspot"] = "adopt-hotspot";
-    JavaDistribution["AdoptOpenJ9"] = "adopt-openj9";
-    JavaDistribution["Temurin"] = "temurin";
-    JavaDistribution["Zulu"] = "zulu";
-    JavaDistribution["Liberica"] = "liberica";
-    JavaDistribution["JdkFile"] = "jdkfile";
-    JavaDistribution["Microsoft"] = "microsoft";
-})(JavaDistribution || (JavaDistribution = {}));
-function getJavaDistribution(distributionName, installerOptions, jdkFile) {
-    switch (distributionName) {
-        case JavaDistribution.JdkFile:
-            return new installer_1.LocalDistribution(installerOptions, jdkFile);
-        case JavaDistribution.Adopt:
-        case JavaDistribution.AdoptHotspot:
-            return new installer_3.AdoptDistribution(installerOptions, installer_3.AdoptImplementation.Hotspot);
-        case JavaDistribution.AdoptOpenJ9:
-            return new installer_3.AdoptDistribution(installerOptions, installer_3.AdoptImplementation.OpenJ9);
-        case JavaDistribution.Temurin:
-            return new installer_4.TemurinDistribution(installerOptions, installer_4.TemurinImplementation.Hotspot);
-        case JavaDistribution.Zulu:
-            return new installer_2.ZuluDistribution(installerOptions);
-        case JavaDistribution.Liberica:
-            return new installer_5.LibericaDistributions(installerOptions);
-        case JavaDistribution.Microsoft:
-            return new installer_6.MicrosoftDistributions(installerOptions);
-        default:
-            return null;
-    }
-}
-exports.getJavaDistribution = getJavaDistribution;
+
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getJavaDistribution = void 0;
+const installer_1 = __webpack_require__(144);
+const installer_2 = __webpack_require__(834);
+const installer_3 = __webpack_require__(584);
+const installer_4 = __webpack_require__(439);
+const installer_5 = __webpack_require__(507);
+const installer_6 = __webpack_require__(196);
+var JavaDistribution;
+(function (JavaDistribution) {
+    JavaDistribution["Adopt"] = "adopt";
+    JavaDistribution["AdoptHotspot"] = "adopt-hotspot";
+    JavaDistribution["AdoptOpenJ9"] = "adopt-openj9";
+    JavaDistribution["Temurin"] = "temurin";
+    JavaDistribution["Zulu"] = "zulu";
+    JavaDistribution["Liberica"] = "liberica";
+    JavaDistribution["JdkFile"] = "jdkfile";
+    JavaDistribution["Microsoft"] = "microsoft";
+})(JavaDistribution || (JavaDistribution = {}));
+function getJavaDistribution(distributionName, installerOptions, jdkFile) {
+    switch (distributionName) {
+        case JavaDistribution.JdkFile:
+            return new installer_1.LocalDistribution(installerOptions, jdkFile);
+        case JavaDistribution.Adopt:
+        case JavaDistribution.AdoptHotspot:
+            return new installer_3.AdoptDistribution(installerOptions, installer_3.AdoptImplementation.Hotspot);
+        case JavaDistribution.AdoptOpenJ9:
+            return new installer_3.AdoptDistribution(installerOptions, installer_3.AdoptImplementation.OpenJ9);
+        case JavaDistribution.Temurin:
+            return new installer_4.TemurinDistribution(installerOptions, installer_4.TemurinImplementation.Hotspot);
+        case JavaDistribution.Zulu:
+            return new installer_2.ZuluDistribution(installerOptions);
+        case JavaDistribution.Liberica:
+            return new installer_5.LibericaDistributions(installerOptions);
+        case JavaDistribution.Microsoft:
+            return new installer_6.MicrosoftDistributions(installerOptions);
+        default:
+            return null;
+    }
+}
+exports.getJavaDistribution = getJavaDistribution;
 
 
 /***/ }),
@@ -59948,83 +59932,83 @@ module.exports = new Type('tag:yaml.org,2002:null', {
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const core = __importStar(__webpack_require__(470));
-const auth = __importStar(__webpack_require__(331));
-const util_1 = __webpack_require__(322);
-const constants = __importStar(__webpack_require__(211));
-const cache_1 = __webpack_require__(319);
-const path = __importStar(__webpack_require__(622));
-const distribution_factory_1 = __webpack_require__(729);
-function run() {
-    return __awaiter(this, void 0, void 0, function* () {
-        try {
-            const version = core.getInput(constants.INPUT_JAVA_VERSION, { required: true });
-            const distributionName = core.getInput(constants.INPUT_DISTRIBUTION, { required: true });
-            const architecture = core.getInput(constants.INPUT_ARCHITECTURE);
-            const packageType = core.getInput(constants.INPUT_JAVA_PACKAGE);
-            const jdkFile = core.getInput(constants.INPUT_JDK_FILE);
-            const cache = core.getInput(constants.INPUT_CACHE);
-            const checkLatest = util_1.getBooleanInput(constants.INPUT_CHECK_LATEST, false);
-            const installerOptions = {
-                architecture,
-                packageType,
-                version,
-                checkLatest
-            };
-            const distribution = distribution_factory_1.getJavaDistribution(distributionName, installerOptions, jdkFile);
-            if (!distribution) {
-                throw new Error(`No supported distribution was found for input ${distributionName}`);
-            }
-            const result = yield distribution.setupJava();
-            core.info('');
-            core.info('Java configuration:');
-            core.info(`  Distribution: ${distributionName}`);
-            core.info(`  Version: ${result.version}`);
-            core.info(`  Path: ${result.path}`);
-            core.info('');
-            const matchersPath = path.join(__dirname, '..', '..', '.github');
-            core.info(`##[add-matcher]${path.join(matchersPath, 'java.json')}`);
-            yield auth.configureAuthentication();
-            if (cache) {
-                yield cache_1.restore(cache);
-            }
-        }
-        catch (error) {
-            core.setFailed(error.message);
-        }
-    });
-}
-run();
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const core = __importStar(__webpack_require__(470));
+const auth = __importStar(__webpack_require__(331));
+const util_1 = __webpack_require__(322);
+const constants = __importStar(__webpack_require__(211));
+const cache_1 = __webpack_require__(319);
+const path = __importStar(__webpack_require__(622));
+const distribution_factory_1 = __webpack_require__(729);
+function run() {
+    return __awaiter(this, void 0, void 0, function* () {
+        try {
+            const version = core.getInput(constants.INPUT_JAVA_VERSION, { required: true });
+            const distributionName = core.getInput(constants.INPUT_DISTRIBUTION, { required: true });
+            const architecture = core.getInput(constants.INPUT_ARCHITECTURE);
+            const packageType = core.getInput(constants.INPUT_JAVA_PACKAGE);
+            const jdkFile = core.getInput(constants.INPUT_JDK_FILE);
+            const cache = core.getInput(constants.INPUT_CACHE);
+            const checkLatest = util_1.getBooleanInput(constants.INPUT_CHECK_LATEST, false);
+            const installerOptions = {
+                architecture,
+                packageType,
+                version,
+                checkLatest
+            };
+            const distribution = distribution_factory_1.getJavaDistribution(distributionName, installerOptions, jdkFile);
+            if (!distribution) {
+                throw new Error(`No supported distribution was found for input ${distributionName}`);
+            }
+            const result = yield distribution.setupJava();
+            core.info('');
+            core.info('Java configuration:');
+            core.info(`  Distribution: ${distributionName}`);
+            core.info(`  Version: ${result.version}`);
+            core.info(`  Path: ${result.path}`);
+            core.info('');
+            const matchersPath = path.join(__dirname, '..', '..', '.github');
+            core.info(`##[add-matcher]${path.join(matchersPath, 'java.json')}`);
+            yield auth.configureAuthentication();
+            if (cache) {
+                yield cache_1.restore(cache);
+            }
+        }
+        catch (error) {
+            core.setFailed(error.message);
+        }
+    });
+}
+run();
 
 
 /***/ }),
@@ -88233,171 +88217,171 @@ module.exports = parse
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ZuluDistribution = void 0;
-const core = __importStar(__webpack_require__(470));
-const tc = __importStar(__webpack_require__(139));
-const path_1 = __importDefault(__webpack_require__(622));
-const fs_1 = __importDefault(__webpack_require__(747));
-const semver_1 = __importDefault(__webpack_require__(876));
-const base_installer_1 = __webpack_require__(83);
-const util_1 = __webpack_require__(322);
-class ZuluDistribution extends base_installer_1.JavaBase {
-    constructor(installerOptions) {
-        super('Zulu', installerOptions);
-    }
-    findPackageForDownload(version) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const availableVersionsRaw = yield this.getAvailableVersions();
-            const availableVersions = availableVersionsRaw.map(item => {
-                return {
-                    version: this.convertVersionToSemver(item.jdk_version),
-                    url: item.url,
-                    zuluVersion: this.convertVersionToSemver(item.zulu_version)
-                };
-            });
-            const satisfiedVersions = availableVersions
-                .filter(item => util_1.isVersionSatisfies(version, item.version))
-                .sort((a, b) => {
-                // Azul provides two versions: jdk_version and azul_version
-                // we should sort by both fields by descending
-                return (-semver_1.default.compareBuild(a.version, b.version) ||
-                    -semver_1.default.compareBuild(a.zuluVersion, b.zuluVersion));
-            })
-                .map(item => {
-                return {
-                    version: item.version,
-                    url: item.url
-                };
-            });
-            const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null;
-            if (!resolvedFullVersion) {
-                const availableOptions = availableVersions.map(item => item.version).join(', ');
-                const availableOptionsMessage = availableOptions
-                    ? `\nAvailable versions: ${availableOptions}`
-                    : '';
-                throw new Error(`Could not find satisfied version for semver ${version}. ${availableOptionsMessage}`);
-            }
-            return resolvedFullVersion;
-        });
-    }
-    downloadTool(javaRelease) {
-        return __awaiter(this, void 0, void 0, function* () {
-            let extractedJavaPath;
-            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
-            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
-            core.info(`Extracting Java archive...`);
-            let extension = util_1.getDownloadArchiveExtension();
-            extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
-            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
-            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
-            const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
-            return { version: javaRelease.version, path: javaPath };
-        });
-    }
-    getAvailableVersions() {
-        var _a, _b;
-        return __awaiter(this, void 0, void 0, function* () {
-            const { arch, hw_bitness, abi } = this.getArchitectureOptions();
-            const [bundleType, features] = this.packageType.split('+');
-            const platform = this.getPlatformOption();
-            const extension = util_1.getDownloadArchiveExtension();
-            const javafx = (_a = features === null || features === void 0 ? void 0 : features.includes('fx')) !== null && _a !== void 0 ? _a : false;
-            const releaseStatus = this.stable ? 'ga' : 'ea';
-            console.time('azul-retrieve-available-versions');
-            const requestArguments = [
-                `os=${platform}`,
-                `ext=${extension}`,
-                `bundle_type=${bundleType}`,
-                `javafx=${javafx}`,
-                `arch=${arch}`,
-                `hw_bitness=${hw_bitness}`,
-                `release_status=${releaseStatus}`,
-                abi ? `abi=${abi}` : null,
-                features ? `features=${features}` : null
-            ]
-                .filter(Boolean)
-                .join('&');
-            const availableVersionsUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?${requestArguments}`;
-            if (core.isDebug()) {
-                core.debug(`Gathering available versions from '${availableVersionsUrl}'`);
-            }
-            const availableVersions = (_b = (yield this.http.getJson(availableVersionsUrl)).result) !== null && _b !== void 0 ? _b : [];
-            if (core.isDebug()) {
-                core.startGroup('Print information about available versions');
-                console.timeEnd('azul-retrieve-available-versions');
-                console.log(`Available versions: [${availableVersions.length}]`);
-                console.log(availableVersions.map(item => item.jdk_version.join('.')).join(', '));
-                core.endGroup();
-            }
-            return availableVersions;
-        });
-    }
-    getArchitectureOptions() {
-        if (this.architecture == 'x64') {
-            return { arch: 'x86', hw_bitness: '64', abi: '' };
-        }
-        else if (this.architecture == 'x86') {
-            return { arch: 'x86', hw_bitness: '32', abi: '' };
-        }
-        else {
-            return { arch: this.architecture, hw_bitness: '', abi: '' };
-        }
-    }
-    getPlatformOption() {
-        // Azul has own platform names so need to map them
-        switch (process.platform) {
-            case 'darwin':
-                return 'macos';
-            case 'win32':
-                return 'windows';
-            default:
-                return process.platform;
-        }
-    }
-    // Azul API returns jdk_version as array of digits like [11, 0, 2, 1]
-    convertVersionToSemver(version_array) {
-        const mainVersion = version_array.slice(0, 3).join('.');
-        if (version_array.length > 3) {
-            // intentionally ignore more than 4 numbers because it is invalid semver
-            return `${mainVersion}+${version_array[3]}`;
-        }
-        return mainVersion;
-    }
-}
-exports.ZuluDistribution = ZuluDistribution;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ZuluDistribution = void 0;
+const core = __importStar(__webpack_require__(470));
+const tc = __importStar(__webpack_require__(139));
+const path_1 = __importDefault(__webpack_require__(622));
+const fs_1 = __importDefault(__webpack_require__(747));
+const semver_1 = __importDefault(__webpack_require__(876));
+const base_installer_1 = __webpack_require__(83);
+const util_1 = __webpack_require__(322);
+class ZuluDistribution extends base_installer_1.JavaBase {
+    constructor(installerOptions) {
+        super('Zulu', installerOptions);
+    }
+    findPackageForDownload(version) {
+        return __awaiter(this, void 0, void 0, function* () {
+            const availableVersionsRaw = yield this.getAvailableVersions();
+            const availableVersions = availableVersionsRaw.map(item => {
+                return {
+                    version: this.convertVersionToSemver(item.jdk_version),
+                    url: item.url,
+                    zuluVersion: this.convertVersionToSemver(item.zulu_version)
+                };
+            });
+            const satisfiedVersions = availableVersions
+                .filter(item => util_1.isVersionSatisfies(version, item.version))
+                .sort((a, b) => {
+                // Azul provides two versions: jdk_version and azul_version
+                // we should sort by both fields by descending
+                return (-semver_1.default.compareBuild(a.version, b.version) ||
+                    -semver_1.default.compareBuild(a.zuluVersion, b.zuluVersion));
+            })
+                .map(item => {
+                return {
+                    version: item.version,
+                    url: item.url
+                };
+            });
+            const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null;
+            if (!resolvedFullVersion) {
+                const availableOptions = availableVersions.map(item => item.version).join(', ');
+                const availableOptionsMessage = availableOptions
+                    ? `\nAvailable versions: ${availableOptions}`
+                    : '';
+                throw new Error(`Could not find satisfied version for semver ${version}. ${availableOptionsMessage}`);
+            }
+            return resolvedFullVersion;
+        });
+    }
+    downloadTool(javaRelease) {
+        return __awaiter(this, void 0, void 0, function* () {
+            let extractedJavaPath;
+            core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
+            const javaArchivePath = yield tc.downloadTool(javaRelease.url);
+            core.info(`Extracting Java archive...`);
+            let extension = util_1.getDownloadArchiveExtension();
+            extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
+            const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
+            const archivePath = path_1.default.join(extractedJavaPath, archiveName);
+            const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
+            return { version: javaRelease.version, path: javaPath };
+        });
+    }
+    getAvailableVersions() {
+        var _a, _b;
+        return __awaiter(this, void 0, void 0, function* () {
+            const { arch, hw_bitness, abi } = this.getArchitectureOptions();
+            const [bundleType, features] = this.packageType.split('+');
+            const platform = this.getPlatformOption();
+            const extension = util_1.getDownloadArchiveExtension();
+            const javafx = (_a = features === null || features === void 0 ? void 0 : features.includes('fx')) !== null && _a !== void 0 ? _a : false;
+            const releaseStatus = this.stable ? 'ga' : 'ea';
+            console.time('azul-retrieve-available-versions');
+            const requestArguments = [
+                `os=${platform}`,
+                `ext=${extension}`,
+                `bundle_type=${bundleType}`,
+                `javafx=${javafx}`,
+                `arch=${arch}`,
+                `hw_bitness=${hw_bitness}`,
+                `release_status=${releaseStatus}`,
+                abi ? `abi=${abi}` : null,
+                features ? `features=${features}` : null
+            ]
+                .filter(Boolean)
+                .join('&');
+            const availableVersionsUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?${requestArguments}`;
+            if (core.isDebug()) {
+                core.debug(`Gathering available versions from '${availableVersionsUrl}'`);
+            }
+            const availableVersions = (_b = (yield this.http.getJson(availableVersionsUrl)).result) !== null && _b !== void 0 ? _b : [];
+            if (core.isDebug()) {
+                core.startGroup('Print information about available versions');
+                console.timeEnd('azul-retrieve-available-versions');
+                console.log(`Available versions: [${availableVersions.length}]`);
+                console.log(availableVersions.map(item => item.jdk_version.join('.')).join(', '));
+                core.endGroup();
+            }
+            return availableVersions;
+        });
+    }
+    getArchitectureOptions() {
+        if (this.architecture == 'x64') {
+            return { arch: 'x86', hw_bitness: '64', abi: '' };
+        }
+        else if (this.architecture == 'x86') {
+            return { arch: 'x86', hw_bitness: '32', abi: '' };
+        }
+        else {
+            return { arch: this.architecture, hw_bitness: '', abi: '' };
+        }
+    }
+    getPlatformOption() {
+        // Azul has own platform names so need to map them
+        switch (process.platform) {
+            case 'darwin':
+                return 'macos';
+            case 'win32':
+                return 'windows';
+            default:
+                return process.platform;
+        }
+    }
+    // Azul API returns jdk_version as array of digits like [11, 0, 2, 1]
+    convertVersionToSemver(version_array) {
+        const mainVersion = version_array.slice(0, 3).join('.');
+        if (version_array.length > 3) {
+            // intentionally ignore more than 4 numbers because it is invalid semver
+            return `${mainVersion}+${version_array[3]}`;
+        }
+        return mainVersion;
+    }
+}
+exports.ZuluDistribution = ZuluDistribution;
 
 
 /***/ }),
@@ -92066,74 +92050,74 @@ function coerce (version, options) {
 /***/ (function(__unusedmodule, exports, __webpack_require__) {
 
 "use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.deleteKey = exports.importKey = exports.PRIVATE_KEY_FILE = void 0;
-const fs = __importStar(__webpack_require__(747));
-const path = __importStar(__webpack_require__(622));
-const io = __importStar(__webpack_require__(1));
-const exec = __importStar(__webpack_require__(986));
-const util = __importStar(__webpack_require__(322));
-exports.PRIVATE_KEY_FILE = path.join(util.getTempDir(), 'private-key.asc');
-const PRIVATE_KEY_FINGERPRINT_REGEX = /\w{40}/;
-function importKey(privateKey) {
-    return __awaiter(this, void 0, void 0, function* () {
-        fs.writeFileSync(exports.PRIVATE_KEY_FILE, privateKey, {
-            encoding: 'utf-8',
-            flag: 'w'
-        });
-        let output = '';
-        const options = {
-            silent: true,
-            listeners: {
-                stdout: (data) => {
-                    output += data.toString();
-                }
-            }
-        };
-        yield exec.exec('gpg', ['--batch', '--import-options', 'import-show', '--import', exports.PRIVATE_KEY_FILE], options);
-        yield io.rmRF(exports.PRIVATE_KEY_FILE);
-        const match = output.match(PRIVATE_KEY_FINGERPRINT_REGEX);
-        return match && match[0];
-    });
-}
-exports.importKey = importKey;
-function deleteKey(keyFingerprint) {
-    return __awaiter(this, void 0, void 0, function* () {
-        yield exec.exec('gpg', ['--batch', '--yes', '--delete-secret-and-public-key', keyFingerprint], {
-            silent: true
-        });
-    });
-}
-exports.deleteKey = deleteKey;
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.deleteKey = exports.importKey = exports.PRIVATE_KEY_FILE = void 0;
+const fs = __importStar(__webpack_require__(747));
+const path = __importStar(__webpack_require__(622));
+const io = __importStar(__webpack_require__(1));
+const exec = __importStar(__webpack_require__(986));
+const util = __importStar(__webpack_require__(322));
+exports.PRIVATE_KEY_FILE = path.join(util.getTempDir(), 'private-key.asc');
+const PRIVATE_KEY_FINGERPRINT_REGEX = /\w{40}/;
+function importKey(privateKey) {
+    return __awaiter(this, void 0, void 0, function* () {
+        fs.writeFileSync(exports.PRIVATE_KEY_FILE, privateKey, {
+            encoding: 'utf-8',
+            flag: 'w'
+        });
+        let output = '';
+        const options = {
+            silent: true,
+            listeners: {
+                stdout: (data) => {
+                    output += data.toString();
+                }
+            }
+        };
+        yield exec.exec('gpg', ['--batch', '--import-options', 'import-show', '--import', exports.PRIVATE_KEY_FILE], options);
+        yield io.rmRF(exports.PRIVATE_KEY_FILE);
+        const match = output.match(PRIVATE_KEY_FINGERPRINT_REGEX);
+        return match && match[0];
+    });
+}
+exports.importKey = importKey;
+function deleteKey(keyFingerprint) {
+    return __awaiter(this, void 0, void 0, function* () {
+        yield exec.exec('gpg', ['--batch', '--yes', '--delete-secret-and-public-key', keyFingerprint], {
+            silent: true
+        });
+    });
+}
+exports.deleteKey = deleteKey;
 
 
 /***/ }),
diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md
index a0b7aff7a..86391f188 100644
--- a/docs/advanced-usage.md
+++ b/docs/advanced-usage.md
@@ -120,6 +120,21 @@ steps:
 - run: java -cp java HelloWorldApp
 ```
 
+## Installing Java from remote archive
+If your use-case requires a custom distribution or a version that is not provided by setup-java, you can specify URL directly and setup-java will take care of the installation and caching on the VM:
+
+```yaml
+steps:
+- uses: actions/setup-java@v2
+  with:
+    distribution: 'jdkfile'
+    jdkFile: https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.10%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz
+    java-version: '11.0.0'
+    architecture: x64
+    
+- run: java -cp java HelloWorldApp
+```
+
 ## Testing against different Java distributions
 **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.
 ```yaml
diff --git a/src/distributions/local/installer.ts b/src/distributions/local/installer.ts
index 1402bc85b..d5be4afdc 100644
--- a/src/distributions/local/installer.ts
+++ b/src/distributions/local/installer.ts
@@ -3,11 +3,10 @@ import * as core from '@actions/core';
 
 import fs from 'fs';
 import path from 'path';
-import semver from 'semver';
 
 import { JavaBase } from '../base-installer';
 import { JavaInstallerOptions, JavaDownloadRelease, JavaInstallerResults } from '../base-models';
-import { extractJdkFile } from '../../util';
+import { extractJdkFile, getDownloadArchiveExtension } from '../../util';
 import { MACOS_JAVA_CONTENT_POSTFIX } from '../../constants';
 
 export class LocalDistribution extends JavaBase {
@@ -25,16 +24,27 @@ export class LocalDistribution extends JavaBase {
       if (!this.jdkFile) {
         throw new Error("'jdkFile' is not specified");
       }
-      const jdkFilePath = path.resolve(this.jdkFile);
-      const stats = fs.statSync(jdkFilePath);
 
+      let jdkFilePath;
+      let extension;
+
+      if (this.jdkFile.match(/^https?:\/\//)) {
+        core.info(`Downloading Java archive from ${this.jdkFile}...`);
+        const javaRelease = await tc.downloadTool(this.jdkFile);
+        jdkFilePath = path.resolve(javaRelease);
+        extension = getDownloadArchiveExtension();
+      } else {
+        jdkFilePath = path.resolve(this.jdkFile);
+      }
+
+      const stats = fs.statSync(jdkFilePath);
       if (!stats.isFile()) {
         throw new Error(`JDK file was not found in path '${jdkFilePath}'`);
       }
 
       core.info(`Extracting Java from '${jdkFilePath}'`);
 
-      const extractedJavaPath = await extractJdkFile(jdkFilePath);
+      const extractedJavaPath = await extractJdkFile(jdkFilePath, extension);
       const archiveName = fs.readdirSync(extractedJavaPath)[0];
       const archivePath = path.join(extractedJavaPath, archiveName);
       const javaVersion = this.version;