From 467164a9457b81b1a8b284414dcafbf08a633697 Mon Sep 17 00:00:00 2001 From: Daksh Jain Date: Tue, 30 Jun 2026 18:31:07 -0400 Subject: [PATCH] fix macOS (#509) --- packages/core/src/api/game/launch.rs | 5 ++- packages/core/src/api/java/mod.rs | 60 ++++++++++++++++++++-------- pnpm-workspace.yaml | 5 +++ 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/packages/core/src/api/game/launch.rs b/packages/core/src/api/game/launch.rs index ceb7ff01..8827a9b2 100644 --- a/packages/core/src/api/game/launch.rs +++ b/packages/core/src/api/game/launch.rs @@ -199,8 +199,11 @@ pub async fn launch_minecraft( }) }); + // On macOS, always remove DYLD_FALLBACK_LIBRARY_PATH which can interfere with + // LWJGL native library loading for OpenAL and other native libraries. + // This is necessary for both debug (cargo sets it) and release builds. #[cfg(target_os = "macos")] - if std::env::var("CARGO").is_ok() { + { command.env_remove("DYLD_FALLBACK_LIBRARY_PATH"); } diff --git a/packages/core/src/api/java/mod.rs b/packages/core/src/api/java/mod.rs index 10788874..e6109a9b 100644 --- a/packages/core/src/api/java/mod.rs +++ b/packages/core/src/api/java/mod.rs @@ -308,23 +308,55 @@ fn internal_locate_java() -> Vec { fn internal_locate_java() -> Vec { let mut found = Vec::new(); - // TODO(macos): More paths for Java installations + // Standard macOS JDK location: /Library/Java/JavaVirtualMachines/*.jdk/Contents/Home/bin/java + if let Ok(entries) = std::fs::read_dir("/Library/Java/JavaVirtualMachines") { + for entry in entries.flatten() { + let java_bin = entry + .path() + .join("Contents") + .join("Home") + .join("bin") + .join(JAVA_BIN); + if java_bin.exists() { + found.push(java_bin); + } + } + } - let paths = vec![ - r"/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands", - r"/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java", - r"/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home", - ]; + // System Java VM framework /usr/bin/java (the Apple-provided stub) + let sys_java = PathBuf::from( + "/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands", + ) + .join(JAVA_BIN); + if sys_java.exists() { + found.push(sys_java); + } - for path in paths { - let path = PathBuf::from(path).join(get_java_bin()); - if path.exists() { - found.push(path); + // Java Applet Plugin (JRE) + let plugin_java = PathBuf::from( + "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home", + ) + .join("bin") + .join(JAVA_BIN); + if plugin_java.exists() { + found.push(plugin_java); + } + + // SDKMAN installations + if let Ok(home) = std::env::var("HOME") { + let sdkman_dir = + PathBuf::from(home).join(".sdkman").join("candidates").join("java"); + if let Ok(entries) = std::fs::read_dir(sdkman_dir) { + for entry in entries.flatten() { + let java_bin = entry.path().join("bin").join(JAVA_BIN); + if java_bin.exists() { + found.push(java_bin); + } + } } } found = find_java_in_path(found); - found } @@ -450,12 +482,6 @@ pub async fn install_java_package(package: &JavaPackage) -> LauncherResult