@@ -19,7 +19,6 @@ export interface JavaVersion {
19
19
major : number
20
20
minor : number
21
21
patch : number
22
- build ?: number
23
22
}
24
23
25
24
export interface AdoptiumJdk {
@@ -319,13 +318,26 @@ export interface HotSpotSettings {
319
318
* @param execPath The path to the Java executable.
320
319
* @returns The parsed HotSpot VM properties.
321
320
*/
322
- export async function getHotSpotSettings ( execPath : string ) : Promise < HotSpotSettings > {
321
+ export async function getHotSpotSettings ( execPath : string ) : Promise < HotSpotSettings | null > {
323
322
324
323
const javaExecutable = execPath . includes ( 'javaw.exe' ) ? execPath . replace ( 'javaw.exe' , 'java.exe' ) : execPath
325
324
325
+ if ( ! await pathExists ( execPath ) ) {
326
+ log . warn ( `Candidate JVM path does not exist, skipping. ${ execPath } ` )
327
+ return null
328
+ }
329
+
326
330
const execAsync = promisify ( exec )
327
331
328
- const { stderr } = await execAsync ( `"${ javaExecutable } " -XshowSettings:properties -version` )
332
+ let stderr
333
+ try {
334
+ stderr = ( await execAsync ( `"${ javaExecutable } " -XshowSettings:properties -version` ) ) . stderr
335
+ } catch ( error ) {
336
+ log . error ( `Failed to resolve JVM settings for '${ execPath } '` )
337
+ log . error ( error )
338
+ return null
339
+ }
340
+
329
341
330
342
const listProps = [
331
343
'java.library.path'
@@ -368,7 +380,11 @@ export async function resolveJvmSettings(paths: string[]): Promise<{ [path: stri
368
380
369
381
for ( const path of paths ) {
370
382
const settings = await getHotSpotSettings ( javaExecFromRoot ( path ) )
371
- ret [ path ] = settings
383
+ if ( settings != null ) {
384
+ ret [ path ] = settings
385
+ } else {
386
+ log . warn ( `Skipping invalid JVM candidate: ${ path } ` )
387
+ }
372
388
}
373
389
374
390
return ret
@@ -389,14 +405,19 @@ export function filterApplicableJavaPaths(resolvedSettings: { [path: string]: Ho
389
405
. filter ( ( [ , settings ] ) => parseInt ( settings [ 'sun.arch.data.model' ] ) === 64 ) // Only allow 64-bit.
390
406
. filter ( ( [ , settings ] ) => arm ? settings [ 'os.arch' ] === 'aarch64' : true ) // Only allow arm on arm architecture (disallow rosetta on m2 mac)
391
407
. map ( ( [ path , settings ] ) => {
392
- const parsedVersion = parseJavaRuntimeVersion ( settings [ 'java.runtime.version' ] )
408
+ const parsedVersion = parseJavaRuntimeVersion ( settings [ 'java.version' ] )
409
+ if ( parsedVersion == null ) {
410
+ log . error ( `Failed to parse JDK version at location '${ path } ' (Vendor: ${ settings [ 'java.vendor' ] } )` )
411
+ return null !
412
+ }
393
413
return {
394
414
semver : parsedVersion ,
395
415
semverStr : javaVersionToString ( parsedVersion ) ,
396
416
vendor : settings [ 'java.vendor' ] ,
397
417
path
398
418
}
399
419
} )
420
+ . filter ( x => x != null )
400
421
401
422
// Now filter by options.
402
423
const jvmDetails = jvmDetailsUnfiltered
@@ -701,7 +722,7 @@ export async function loadMojangLauncherData(): Promise<LauncherJson | null> {
701
722
* @param {string } verString Full version string to parse.
702
723
* @returns Object containing the version information.
703
724
*/
704
- export function parseJavaRuntimeVersion ( verString : string ) : JavaVersion {
725
+ export function parseJavaRuntimeVersion ( verString : string ) : JavaVersion | null {
705
726
if ( verString . startsWith ( '1.' ) ) {
706
727
return parseJavaRuntimeVersionLegacy ( verString )
707
728
} else {
@@ -716,21 +737,21 @@ export function parseJavaRuntimeVersion(verString: string): JavaVersion {
716
737
* @param {string } verString Full version string to parse.
717
738
* @returns Object containing the version information.
718
739
*/
719
- export function parseJavaRuntimeVersionLegacy ( verString : string ) : JavaVersion {
740
+ export function parseJavaRuntimeVersionLegacy ( verString : string ) : JavaVersion | null {
720
741
// 1.{major}.0_{update}-b{build}
721
742
// ex. 1.8.0_152-b16
722
743
const regex = / 1 .( \d + ) .( \d + ) _ ( \d + ) (?: - b ( \d + ) ) ? /
723
744
const match = regex . exec ( verString ) !
724
745
725
746
if ( match == null ) {
726
- throw new Error ( `Failed to parse legacy Java version: ${ verString } ` )
747
+ log . error ( `Failed to parse legacy Java version: ${ verString } ` )
748
+ return null
727
749
}
728
750
729
751
return {
730
752
major : parseInt ( match [ 1 ] ) ,
731
753
minor : parseInt ( match [ 2 ] ) ,
732
- patch : parseInt ( match [ 3 ] ) ,
733
- build : match [ 4 ] != undefined ? parseInt ( match [ 4 ] ) : undefined
754
+ patch : parseInt ( match [ 3 ] )
734
755
}
735
756
}
736
757
@@ -741,26 +762,26 @@ export function parseJavaRuntimeVersionLegacy(verString: string): JavaVersion {
741
762
* @param {string } verString Full version string to parse.
742
763
* @returns Object containing the version information.
743
764
*/
744
- export function parseJavaRuntimeVersionSemver ( verString : string ) : JavaVersion {
765
+ export function parseJavaRuntimeVersionSemver ( verString : string ) : JavaVersion | null {
745
766
// {major}.{minor}.{patch}+{build}
746
767
// ex. 10.0.2+13 or 10.0.2.13
747
768
const regex = / ( \d + ) \. ( \d + ) .( \d + ) (?: [ + . ] ( \d + ) ) ? /
748
769
const match = regex . exec ( verString ) !
749
770
750
771
if ( match == null ) {
751
- throw new Error ( `Failed to parse semver Java version: ${ verString } ` )
772
+ log . error ( `Failed to parse semver Java version: ${ verString } ` )
773
+ return null
752
774
}
753
775
754
776
return {
755
777
major : parseInt ( match [ 1 ] ) ,
756
778
minor : parseInt ( match [ 2 ] ) ,
757
- patch : parseInt ( match [ 3 ] ) ,
758
- build : match [ 4 ] != undefined ? parseInt ( match [ 4 ] ) : undefined
779
+ patch : parseInt ( match [ 3 ] )
759
780
}
760
781
}
761
782
762
- export function javaVersionToString ( { major, minor, patch, build } : JavaVersion ) : string {
763
- return `${ major } .${ minor } .${ patch } ${ build != null ? `+ ${ build } ` : '' } `
783
+ export function javaVersionToString ( { major, minor, patch } : JavaVersion ) : string {
784
+ return `${ major } .${ minor } .${ patch } `
764
785
}
765
786
766
787
export interface JavaDiscoverer {
@@ -898,7 +919,7 @@ export class Win32RegistryJavaDiscoverer implements JavaDiscoverer {
898
919
// eslint-disable-next-line @typescript-eslint/no-explicit-any
899
920
if ( isNaN ( vKey as any ) ) {
900
921
// Should be a semver key.
901
- major = parseJavaRuntimeVersion ( vKey ) . major
922
+ major = parseJavaRuntimeVersion ( vKey ) ? .major ?? - 1
902
923
} else {
903
924
// This is an abbreviated version, ie 1.8 or 17.
904
925
const asNum = parseFloat ( vKey )
0 commit comments