From aeb9df40d21f417739e70eec481d8e1b6b57433a Mon Sep 17 00:00:00 2001 From: aecsocket <43144841+aecsocket@users.noreply.github.com> Date: Tue, 27 Oct 2026 20:52:57 +0000 Subject: [PATCH 1/2] fix: if no native library is available for this arch, don't include in classpath --- packages/app-lib/src/launcher/args.rs | 4 +- packages/app-lib/src/launcher/download.rs | 11 +- packages/app-lib/src/launcher/library.rs | 133 ++++++++++++---------- 3 files changed, 83 insertions(+), 65 deletions(-) diff --git a/packages/app-lib/src/launcher/args.rs b/packages/app-lib/src/launcher/args.rs index 7e615dd828e..8474dcd68b6 100644 --- a/packages/app-lib/src/launcher/args.rs +++ b/packages/app-lib/src/launcher/args.rs @@ -55,14 +55,14 @@ pub fn get_class_paths( return None; } - if !library.include_in_classpath { + if !library.include_in_classpath || library.is_native() { return None; } Some(get_lib_path( libraries_path, &library.name, - library.native_classifier(java_arch).is_some(), + false, )) })) .process_results(|iter| { diff --git a/packages/app-lib/src/launcher/download.rs b/packages/app-lib/src/launcher/download.rs index a22bb2a07ef..82266465e4b 100644 --- a/packages/app-lib/src/launcher/download.rs +++ b/packages/app-lib/src/launcher/download.rs @@ -890,7 +890,16 @@ pub async fn download_libraries( return Ok(()); } - // When a library has natives, we only need to download such natives, as PrismLauncher does + if library.is_native() + && library.native_classifier(java_arch).is_none() + { + tracing::trace!( + "Skipped incompatible native library {}", + &library.name + ); + return Ok(()); + } + if let Some((url, sha1, size)) = library.native_download(java_arch)? { diff --git a/packages/app-lib/src/launcher/library.rs b/packages/app-lib/src/launcher/library.rs index 649b645bf44..4085fae6552 100644 --- a/packages/app-lib/src/launcher/library.rs +++ b/packages/app-lib/src/launcher/library.rs @@ -1,74 +1,83 @@ use crate::util::platform::OperatingSystemExt; use minecraft_meta_manifest::{ - minecraft::{Library, OperatingSystem}, - util::{MavenCoordinate, Sha1}, + minecraft::{Library, OperatingSystem}, + util::{MavenCoordinate, Sha1}, }; use url::Url; pub(crate) trait LibraryExt { - /// Native classification does not depend on classifier download metadata. - fn native_classifier(&self, java_arch: &str) -> Option; + /// Whether this library declares platform-specific native classifiers. + fn is_native(&self) -> bool; - /// Resolves explicit native metadata or derives its Maven classifier URL. - fn native_download( - &self, - java_arch: &str, - ) -> anyhow::Result, Option)>>; + /// Native classification does not depend on classifier download metadata. + fn native_classifier(&self, java_arch: &str) -> Option; + + /// Resolves explicit native metadata or derives its Maven classifier URL. + fn native_download( + &self, + java_arch: &str, + ) -> anyhow::Result, Option)>>; } impl LibraryExt for Library { - /// Native classification does not depend on classifier download metadata. - fn native_classifier(&self, java_arch: &str) -> Option { - let natives = self.natives.as_ref()?; - let os = OperatingSystem::native_arch(java_arch); - let classifier = natives.get(&os)?; - let width = if matches!(java_arch, "x86" | "i386" | "i686" | "arm") { - "32" - } else { - "64" - }; - Some(classifier.replace("${arch}", width)) - } + fn is_native(&self) -> bool { + self.natives + .as_ref() + .is_some_and(|natives| !natives.is_empty()) + } + + /// Native classification does not depend on classifier download metadata. + fn native_classifier(&self, java_arch: &str) -> Option { + let natives = self.natives.as_ref()?; + let os = OperatingSystem::native_arch(java_arch); + let classifier = natives.get(&os)?; + let width = if matches!(java_arch, "x86" | "i386" | "i686" | "arm") { + "32" + } else { + "64" + }; + Some(classifier.replace("${arch}", width)) + } - /// Resolves explicit native metadata or derives its Maven classifier URL. - fn native_download( - &self, - java_arch: &str, - ) -> anyhow::Result, Option)>> { - let Some(classifier) = self.native_classifier(java_arch) else { - return Ok(None); - }; - let explicit = self - .downloads - .as_ref() - .and_then(|downloads| downloads.classifiers.as_ref()) - .and_then(|classifiers| classifiers.get(&classifier)); - if let Some(download) = explicit - && let Some(url) = &download.url - { - return Ok(Some(( - url.clone(), - Some(download.sha1), - Some(download.size), - ))); - } - let mut coordinate: MavenCoordinate = self.name.parse()?; - coordinate.classifier = Some(classifier.parse()?); - let path = coordinate.to_maven_path(); - let repository = self - .url - .as_deref() - .filter(|url| !url.is_empty()) - .unwrap_or("https://libraries.minecraft.net/"); - let url = Url::parse(&format!( - "{}/{relative}", - repository.trim_end_matches('/'), - relative = &path["maven/".len()..] - ))?; - Ok(Some(( - url, - explicit.map(|download| download.sha1), - explicit.map(|download| download.size), - ))) - } + /// Resolves explicit native metadata or derives its Maven classifier URL. + fn native_download( + &self, + java_arch: &str, + ) -> anyhow::Result, Option)>> { + let Some(classifier) = self.native_classifier(java_arch) else { + return Ok(None); + }; + let explicit = self + .downloads + .as_ref() + .and_then(|downloads| downloads.classifiers.as_ref()) + .and_then(|classifiers| classifiers.get(&classifier)); + if let Some(download) = explicit + && let Some(url) = &download.url + { + return Ok(Some(( + url.clone(), + Some(download.sha1), + Some(download.size), + ))); + } + let mut coordinate: MavenCoordinate = self.name.parse()?; + coordinate.classifier = Some(classifier.parse()?); + let path = coordinate.to_maven_path(); + let repository = self + .url + .as_deref() + .filter(|url| !url.is_empty()) + .unwrap_or("https://libraries.minecraft.net/"); + let url = Url::parse(&format!( + "{}/{relative}", + repository.trim_end_matches('/'), + relative = &path["maven/".len()..] + ))?; + Ok(Some(( + url, + explicit.map(|download| download.sha1), + explicit.map(|download| download.size), + ))) + } } From b686c2aa8bbd1601c650dc8f8aa2cab020533769 Mon Sep 17 00:00:00 2001 From: aecsocket <43144841+aecsocket@users.noreply.github.com> Date: Tue, 27 Oct 2026 20:58:41 +0000 Subject: [PATCH 2/2] fmt --- packages/app-lib/src/launcher/args.rs | 6 +- packages/app-lib/src/launcher/library.rs | 138 +++++++++++------------ 2 files changed, 70 insertions(+), 74 deletions(-) diff --git a/packages/app-lib/src/launcher/args.rs b/packages/app-lib/src/launcher/args.rs index 8474dcd68b6..3906ad26393 100644 --- a/packages/app-lib/src/launcher/args.rs +++ b/packages/app-lib/src/launcher/args.rs @@ -59,11 +59,7 @@ pub fn get_class_paths( return None; } - Some(get_lib_path( - libraries_path, - &library.name, - false, - )) + Some(get_lib_path(libraries_path, &library.name, false)) })) .process_results(|iter| { iter.unique().join(classpath_separator(java_arch)) diff --git a/packages/app-lib/src/launcher/library.rs b/packages/app-lib/src/launcher/library.rs index 4085fae6552..6143472f6fd 100644 --- a/packages/app-lib/src/launcher/library.rs +++ b/packages/app-lib/src/launcher/library.rs @@ -1,83 +1,83 @@ use crate::util::platform::OperatingSystemExt; use minecraft_meta_manifest::{ - minecraft::{Library, OperatingSystem}, - util::{MavenCoordinate, Sha1}, + minecraft::{Library, OperatingSystem}, + util::{MavenCoordinate, Sha1}, }; use url::Url; pub(crate) trait LibraryExt { - /// Whether this library declares platform-specific native classifiers. - fn is_native(&self) -> bool; + /// Whether this library declares platform-specific native classifiers. + fn is_native(&self) -> bool; - /// Native classification does not depend on classifier download metadata. - fn native_classifier(&self, java_arch: &str) -> Option; + /// Native classification does not depend on classifier download metadata. + fn native_classifier(&self, java_arch: &str) -> Option; - /// Resolves explicit native metadata or derives its Maven classifier URL. - fn native_download( - &self, - java_arch: &str, - ) -> anyhow::Result, Option)>>; + /// Resolves explicit native metadata or derives its Maven classifier URL. + fn native_download( + &self, + java_arch: &str, + ) -> anyhow::Result, Option)>>; } impl LibraryExt for Library { - fn is_native(&self) -> bool { - self.natives - .as_ref() - .is_some_and(|natives| !natives.is_empty()) - } + fn is_native(&self) -> bool { + self.natives + .as_ref() + .is_some_and(|natives| !natives.is_empty()) + } - /// Native classification does not depend on classifier download metadata. - fn native_classifier(&self, java_arch: &str) -> Option { - let natives = self.natives.as_ref()?; - let os = OperatingSystem::native_arch(java_arch); - let classifier = natives.get(&os)?; - let width = if matches!(java_arch, "x86" | "i386" | "i686" | "arm") { - "32" - } else { - "64" - }; - Some(classifier.replace("${arch}", width)) - } + /// Native classification does not depend on classifier download metadata. + fn native_classifier(&self, java_arch: &str) -> Option { + let natives = self.natives.as_ref()?; + let os = OperatingSystem::native_arch(java_arch); + let classifier = natives.get(&os)?; + let width = if matches!(java_arch, "x86" | "i386" | "i686" | "arm") { + "32" + } else { + "64" + }; + Some(classifier.replace("${arch}", width)) + } - /// Resolves explicit native metadata or derives its Maven classifier URL. - fn native_download( - &self, - java_arch: &str, - ) -> anyhow::Result, Option)>> { - let Some(classifier) = self.native_classifier(java_arch) else { - return Ok(None); - }; - let explicit = self - .downloads - .as_ref() - .and_then(|downloads| downloads.classifiers.as_ref()) - .and_then(|classifiers| classifiers.get(&classifier)); - if let Some(download) = explicit - && let Some(url) = &download.url - { - return Ok(Some(( - url.clone(), - Some(download.sha1), - Some(download.size), - ))); - } - let mut coordinate: MavenCoordinate = self.name.parse()?; - coordinate.classifier = Some(classifier.parse()?); - let path = coordinate.to_maven_path(); - let repository = self - .url - .as_deref() - .filter(|url| !url.is_empty()) - .unwrap_or("https://libraries.minecraft.net/"); - let url = Url::parse(&format!( - "{}/{relative}", - repository.trim_end_matches('/'), - relative = &path["maven/".len()..] - ))?; - Ok(Some(( - url, - explicit.map(|download| download.sha1), - explicit.map(|download| download.size), - ))) - } + /// Resolves explicit native metadata or derives its Maven classifier URL. + fn native_download( + &self, + java_arch: &str, + ) -> anyhow::Result, Option)>> { + let Some(classifier) = self.native_classifier(java_arch) else { + return Ok(None); + }; + let explicit = self + .downloads + .as_ref() + .and_then(|downloads| downloads.classifiers.as_ref()) + .and_then(|classifiers| classifiers.get(&classifier)); + if let Some(download) = explicit + && let Some(url) = &download.url + { + return Ok(Some(( + url.clone(), + Some(download.sha1), + Some(download.size), + ))); + } + let mut coordinate: MavenCoordinate = self.name.parse()?; + coordinate.classifier = Some(classifier.parse()?); + let path = coordinate.to_maven_path(); + let repository = self + .url + .as_deref() + .filter(|url| !url.is_empty()) + .unwrap_or("https://libraries.minecraft.net/"); + let url = Url::parse(&format!( + "{}/{relative}", + repository.trim_end_matches('/'), + relative = &path["maven/".len()..] + ))?; + Ok(Some(( + url, + explicit.map(|download| download.sha1), + explicit.map(|download| download.size), + ))) + } }