From a8698ef39450607053da3fb8b353bafdd74c9b74 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Mon, 10 Aug 2026 23:08:13 +0900 Subject: [PATCH] =?UTF-8?q?fix(installer):=20=EC=9E=90=EB=B0=94=20?= =?UTF-8?q?=EB=AA=BB=20=EC=B0=BE=EC=9D=84=20=EB=95=8C(ENOENT)=20"=EB=B0=94?= =?UTF-8?q?=EB=8B=90=EB=9D=BC=20=EB=A8=BC=EC=A0=80=20=EC=8B=A4=ED=96=89"?= =?UTF-8?q?=20=EC=95=88=EB=82=B4=20+=20JDK=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=ED=83=90=EC=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 원인: findJavaExecutable 이 JAVA_HOME → .minecraft/runtime(런처 번들 JRE, 바닐라를 한 번 실행해야 생김) → 폴백 "java.exe" 순이라, 바닐라 미실행 + 시스템 java 없음이면 fabric-installer 실행에서 spawn java.exe ENOENT 로 실패. - findJavaExecutable 에 설치기 자동설치 JDK(.mc_custom/jdk) 와 C:\Program Files\Java 탐색을 추가해 불필요한 실패를 줄인다(fabric 실행엔 아무 자바나 됨). - 그래도 자바가 전혀 없어 ENOENT 면, "먼저 [버전] 바닐라를 한 번 실행해 자바 런타임을 받은 뒤 다시 시도" 안내 메시지로 바꿔 던진다. 0.4.24→0.4.25. Co-Authored-By: Claude Opus 4.7 --- locales/installer/ko-kr.json | 1 + package.json | 2 +- src/installer/main.ts | 23 +++++++++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) 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 }