mirror of
https://gitea.com/actions/setup-java.git
synced 2026-07-13 20:01:55 +08:00
* Support pinning java-version as "latest" Add a `latest` alias for the `java-version` input that floats to the newest available stable (GA) release. It is normalized to the SemVer wildcard at the base-installer layer and always resolves from remote (like `check-latest: true`). List-based distributions resolve it automatically via the existing newest-first matching. Corretto selects its newest available major; Oracle and GraalVM look up the newest GA major via the Adoptium API and request it, failing with an actionable error if that major isn't published yet. The jdkfile distribution rejects `latest`. Closes #832 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Clarify latest note for oracle/graalvm version resolution vs download Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * graalvm-community: float latest to its own newest GA release GraalVM Community publishes its releases on GitHub, so the `latest` alias now matches against that real release list using the SemVer wildcard instead of asking the Adoptium API for the newest GA major. This prevents `latest` from hard-failing when GraalVM lags behind a freshly released Java major (e.g. Adoptium reports 26 before GraalVM ships it). Oracle GraalVM has no listing endpoint, so it keeps deriving the newest major from Adoptium and errors clearly if that major is not yet published. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Give latest+qualifier inputs (e.g. latest-ea) a targeted error Inputs like 'latest-ea' had their '-ea' suffix stripped and fell through to the generic SemVer validation, failing with a confusing "'latest' is not valid SemVer" message even though 'latest' is supported. Add an explicit guard so any 'latest*' value other than exactly 'latest' throws a targeted error explaining that 'latest' resolves GA releases only and cannot be combined with '-ea' or other qualifiers. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
106 lines
3.1 KiB
TypeScript
106 lines
3.1 KiB
TypeScript
import * as tc from '@actions/tool-cache';
|
|
import * as core from '@actions/core';
|
|
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
|
|
import {JavaBase} from '../base-installer.js';
|
|
import {
|
|
JavaInstallerOptions,
|
|
JavaDownloadRelease,
|
|
JavaInstallerResults
|
|
} from '../base-models.js';
|
|
import {extractJdkFile} from '../../util.js';
|
|
import {MACOS_JAVA_CONTENT_POSTFIX} from '../../constants.js';
|
|
|
|
export class LocalDistribution extends JavaBase {
|
|
constructor(
|
|
installerOptions: JavaInstallerOptions,
|
|
private jdkFile?: string
|
|
) {
|
|
super('jdkfile', installerOptions);
|
|
}
|
|
|
|
public async setupJava(): Promise<JavaInstallerResults> {
|
|
if (this.latest) {
|
|
throw new Error(
|
|
"The 'latest' version alias is not supported for the 'jdkfile' distribution. Please specify a concrete version."
|
|
);
|
|
}
|
|
|
|
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.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 archiveName = fs.readdirSync(extractedJavaPath)[0];
|
|
const archivePath = path.join(extractedJavaPath, archiveName);
|
|
const javaVersion = this.version;
|
|
|
|
const javaPath = await tc.cacheDir(
|
|
archivePath,
|
|
this.toolcacheFolderName,
|
|
this.getToolcacheVersionName(javaVersion),
|
|
this.architecture
|
|
);
|
|
|
|
foundJava = {
|
|
version: javaVersion,
|
|
path: javaPath
|
|
};
|
|
}
|
|
|
|
// JDK folder may contain postfix "Contents/Home" on macOS
|
|
const macOSPostfixPath = path.join(
|
|
foundJava.path,
|
|
MACOS_JAVA_CONTENT_POSTFIX
|
|
);
|
|
if (process.platform === 'darwin' && fs.existsSync(macOSPostfixPath)) {
|
|
foundJava.path = macOSPostfixPath;
|
|
}
|
|
|
|
if (this.setDefault) {
|
|
core.info(`Setting Java ${foundJava.version} as the default`);
|
|
this.setJavaDefault(foundJava.version, foundJava.path);
|
|
} else {
|
|
core.info(
|
|
`Installing Java ${foundJava.version} (not setting as default)`
|
|
);
|
|
this.setJavaEnvironment(foundJava.version, foundJava.path);
|
|
}
|
|
return foundJava;
|
|
}
|
|
|
|
protected async findPackageForDownload(
|
|
version: string // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
): Promise<JavaDownloadRelease> {
|
|
throw new Error(
|
|
'This method should not be implemented in local file provider'
|
|
);
|
|
}
|
|
|
|
protected async downloadTool(
|
|
javaRelease: JavaDownloadRelease // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
): Promise<JavaInstallerResults> {
|
|
throw new Error(
|
|
'This method should not be implemented in local file provider'
|
|
);
|
|
}
|
|
}
|