diff --git a/locales/installer/ko-kr.json b/locales/installer/ko-kr.json index 276846d..7d09c81 100644 --- a/locales/installer/ko-kr.json +++ b/locales/installer/ko-kr.json @@ -208,6 +208,7 @@ "jdkBusy": "이미 JDK 설치가 진행 중입니다.", "javaExeMissing": "설치 후 java 실행 파일을 찾지 못했습니다: {{path}}", "javaSpawnFailed": "Java 실행 실패: {{message}}", + "javaNotFoundRunVanilla": "자바를 찾지 못해 설치를 진행할 수 없습니다. 먼저 마인크래프트 런처에서 [{{version}}] 바닐라를 한 번 실행해 자바 런타임을 받은 다음, 이 설치기를 다시 시도해 주세요.", "fabricInstallerExit": "fabric-installer 종료 코드 {{code}}{{detail}}", "fabricLoaderRequired": "Fabric 로더 버전이 음악퀴즈에 지정되지 않았습니다. 관리 사이트에서 platform.loaderVersion 을 설정해 주세요.", "fabricInstallerListEmpty": "Fabric installer 목록을 받지 못했습니다.", diff --git a/package.json b/package.json index 27b7aef..d3564bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "minecraft-music-quiz-installer", - "version": "0.4.24", + "version": "0.4.25", "description": "마인크래프트 음악퀴즈 간편설치기 + 관리 사이트", "main": "dist/installer/main.js", "scripts": { diff --git a/src/installer/main.ts b/src/installer/main.ts index c157b63..ebed190 100644 --- a/src/installer/main.ts +++ b/src/installer/main.ts @@ -1518,7 +1518,17 @@ async function installFabricLoader(pack: PackDefinition, customRoot: string): Pr '-noprofile' ] sendLog(t('log.fabricInstallStart', { mc: pack.mcVersion, loader: loaderVersion, dir: mcRoot })) - await runJavaProcess(javaCmd, args) + try { + await runJavaProcess(javaCmd, args) + } catch (err) { + // 자바를 못 찾아 spawn ENOENT 면, 대개 바닐라를 한 번도 실행하지 않아 런처 자바 런타임 + // (.minecraft/runtime)이 없고 다른 자바도 없는 경우다. 해당 버전으로 마인크래프트를 먼저 + // 실행하라고 안내한다. + if (/ENOENT/i.test((err as Error).message)) { + throw new Error(t('errors.javaNotFoundRunVanilla', { version: pack.mcVersion })) + } + throw err + } sendLog(t('log.fabricInstallDone')) } @@ -1570,7 +1580,16 @@ async function findJavaExecutable(): Promise { // skip } - // 3) PATH 폴백. + // 3) 설치기가 자동 설치한 JDK(.mc_custom/jdk) 또는 시스템 JDK(C:\Program Files\Java). + // fabric-installer 실행에는 아무 자바나 되므로(버전 무관) 있으면 그대로 쓴다. + for (const base of [path.join(getAppDataDir(), getMcCustomDirName(), 'jdk'), 'C:\\Program Files\\Java']) { + for (const home of jdkHomesUnder(base)) { + const exe = path.join(home, 'bin', javaName) + if (fs.existsSync(exe)) return exe + } + } + + // 4) PATH 폴백. return javaName }