diff --git a/__tests__/distributors/openjdk-installer.test.ts b/__tests__/distributors/openjdk-installer.test.ts
index b2799e61..7abf64ed 100644
--- a/__tests__/distributors/openjdk-installer.test.ts
+++ b/__tests__/distributors/openjdk-installer.test.ts
@@ -47,6 +47,8 @@ const archivePage = `
tar.gz
tar.gz
tar.gz
+
9.0.4 (build 9.0.4+11) |
+ tar.gz
`;
function createDistribution(
@@ -111,6 +113,16 @@ describe('OpenJdkDistribution', () => {
expect(result.version).toBe('26.0.2+10');
});
+ it('resolves an exact build from a legacy archive heading', async () => {
+ const result =
+ await createDistribution('9.0.4+11')['findPackageForDownload'](
+ '9.0.4+11'
+ );
+
+ expect(result.version).toBe('9.0.4+11');
+ expect(result.url).toContain('/binaries/openjdk-9.0.4_linux-x64_bin');
+ });
+
it('resolves a four-field Java version', async () => {
const result =
await createDistribution('18.0.1.1')['findPackageForDownload'](
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 269d760f..76f07358 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -131939,13 +131939,23 @@ class OpenJdkDistribution extends JavaBase {
const pattern = new RegExp(`href="(https://download\\.java\\.net/[^"]+/openjdk-([^"_]+)_${platformPattern}-${arch}_bin\\.${extensionPattern})"`, 'g');
return Array.from(html.matchAll(pattern), match => {
const url = match[1];
- const build = url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1];
+ const build = url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1] ??
+ this.findBuildInArchiveHeading(html, match.index, match[2]);
return {
version: this.toSemver(match[2], build),
url
};
});
}
+ findBuildInArchiveHeading(html, assetIndex, version) {
+ const headings = Array.from(html.slice(0, assetIndex).matchAll(/\(build\s+([^)]+)\)/g));
+ const headingVersion = headings.at(-1)?.[1];
+ if (!headingVersion) {
+ return undefined;
+ }
+ const [javaVersion, build] = headingVersion.split('+');
+ return javaVersion === version ? build : undefined;
+ }
toSemver(version, urlBuild) {
const [javaVersion, filenameBuild] = version.replace('-ea', '').split('+');
const versionParts = javaVersion.split('.');
diff --git a/src/distributions/openjdk/installer.ts b/src/distributions/openjdk/installer.ts
index 5776cddc..3041a563 100644
--- a/src/distributions/openjdk/installer.ts
+++ b/src/distributions/openjdk/installer.ts
@@ -126,7 +126,9 @@ export class OpenJdkDistribution extends JavaBase {
return Array.from(html.matchAll(pattern), match => {
const url = match[1];
- const build = url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1];
+ const build =
+ url.match(/\/(\d+)\/(?:GPL\/)?openjdk-/)?.[1] ??
+ this.findBuildInArchiveHeading(html, match.index, match[2]);
return {
version: this.toSemver(match[2], build),
url
@@ -134,6 +136,23 @@ export class OpenJdkDistribution extends JavaBase {
});
}
+ private findBuildInArchiveHeading(
+ html: string,
+ assetIndex: number,
+ version: string
+ ): string | undefined {
+ const headings = Array.from(
+ html.slice(0, assetIndex).matchAll(/\(build\s+([^)]+)\)/g)
+ );
+ const headingVersion = headings.at(-1)?.[1];
+ if (!headingVersion) {
+ return undefined;
+ }
+
+ const [javaVersion, build] = headingVersion.split('+');
+ return javaVersion === version ? build : undefined;
+ }
+
private toSemver(version: string, urlBuild?: string): string {
const [javaVersion, filenameBuild] = version.replace('-ea', '').split('+');
const versionParts = javaVersion.split('.');