From a4f9438d9ec29a14d665992e5a5e4330b17eeae8 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sat, 16 Aug 2025 15:45:12 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20Pack200=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20(#4267)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HMCL/build.gradle.kts | 1 - .../hmcl/upgrade/HMCLDownloadTask.java | 14 -- .../jackhuang/hmcl/upgrade/RemoteVersion.java | 10 +- .../org/jackhuang/hmcl/util/Pack200Utils.java | 122 ------------------ 4 files changed, 2 insertions(+), 145 deletions(-) delete mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java diff --git a/HMCL/build.gradle.kts b/HMCL/build.gradle.kts index 3040165c8..21a106493 100644 --- a/HMCL/build.gradle.kts +++ b/HMCL/build.gradle.kts @@ -151,7 +151,6 @@ tasks.shadowJar { "CurseForge-Api-Key" to curseForgeApiKey, "Authlib-Injector-Version" to libs.authlib.injector.get().version!!, "Build-Channel" to versionType, - "Class-Path" to "pack200.jar", "Add-Opens" to listOf( "java.base/java.lang", "java.base/java.lang.reflect", diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/HMCLDownloadTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/HMCLDownloadTask.java index 653e398f3..a955ae83c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/HMCLDownloadTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/HMCLDownloadTask.java @@ -18,14 +18,9 @@ package org.jackhuang.hmcl.upgrade; import org.jackhuang.hmcl.task.FileDownloadTask; -import org.jackhuang.hmcl.util.Pack200Utils; -import org.tukaani.xz.XZInputStream; -import java.io.ByteArrayInputStream; -import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.jar.JarOutputStream; final class HMCLDownloadTask extends FileDownloadTask { @@ -45,15 +40,6 @@ final class HMCLDownloadTask extends FileDownloadTask { switch (archiveFormat) { case JAR: break; - - case PACK_XZ: - byte[] raw = Files.readAllBytes(target); - try (InputStream in = new XZInputStream(new ByteArrayInputStream(raw)); - JarOutputStream out = new JarOutputStream(Files.newOutputStream(target))) { - Pack200Utils.unpack(in, out); - } - break; - default: throw new IllegalArgumentException("Unknown format: " + archiveFormat); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/RemoteVersion.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/RemoteVersion.java index 627877d12..848e03df7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/RemoteVersion.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/RemoteVersion.java @@ -21,14 +21,13 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; -import org.jackhuang.hmcl.util.Pack200Utils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.NetworkUtils; import java.io.IOException; import java.util.Optional; -public class RemoteVersion { +public final class RemoteVersion { public static RemoteVersion fetch(UpdateChannel channel, String url) throws IOException { try { @@ -36,12 +35,8 @@ public class RemoteVersion { String version = Optional.ofNullable(response.get("version")).map(JsonElement::getAsString).orElseThrow(() -> new IOException("version is missing")); String jarUrl = Optional.ofNullable(response.get("jar")).map(JsonElement::getAsString).orElse(null); String jarHash = Optional.ofNullable(response.get("jarsha1")).map(JsonElement::getAsString).orElse(null); - String packXZUrl = Optional.ofNullable(response.get("packxz")).map(JsonElement::getAsString).orElse(null); - String packXZHash = Optional.ofNullable(response.get("packxzsha1")).map(JsonElement::getAsString).orElse(null); boolean force = Optional.ofNullable(response.get("force")).map(JsonElement::getAsBoolean).orElse(false); - if (Pack200Utils.isSupported() && packXZUrl != null && packXZHash != null) { - return new RemoteVersion(channel, version, packXZUrl, Type.PACK_XZ, new IntegrityCheck("SHA-1", packXZHash), force); - } else if (jarUrl != null && jarHash != null) { + if (jarUrl != null && jarHash != null) { return new RemoteVersion(channel, version, jarUrl, Type.JAR, new IntegrityCheck("SHA-1", jarHash), force); } else { throw new IOException("No download url is available"); @@ -97,7 +92,6 @@ public class RemoteVersion { } public enum Type { - PACK_XZ, JAR } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java deleted file mode 100644 index 39090df69..000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2021 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.util; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.util.jar.JarOutputStream; - -import static org.jackhuang.hmcl.util.logging.Logger.LOG; - -/** - * @author Glavo - */ -public final class Pack200Utils { - private Pack200Utils() { - } - - private static final String[] IMPL_NAMES = { - "java.util.jar.Pack200", - "org.glavo.pack200.Pack200", - "io.pack200.Pack200" - }; - - private static final MethodHandle newUnpackerHandle; - private static final MethodHandle unpackHandle; - private static final MethodHandle unpackFileHandle; - - static { - Class pack200Class = null; - Class unpackerClass = null; - - for (String implName : IMPL_NAMES) { - try { - pack200Class = Class.forName(implName); - unpackerClass = Class.forName(implName + "$Unpacker"); - break; - } catch (ClassNotFoundException ignored) { - } - } - - if (pack200Class == null) { - LOG.warning("Pack200 not found"); - newUnpackerHandle = null; - unpackHandle = null; - unpackFileHandle = null; - } else { - final MethodHandles.Lookup lookup = MethodHandles.publicLookup(); - MethodHandle newUnpacker = null; - MethodHandle unpack = null; - MethodHandle unpackFile = null; - try { - newUnpacker = lookup.findStatic(pack200Class, "newUnpacker", MethodType.methodType(unpackerClass)); - unpack = lookup.findVirtual(unpackerClass, "unpack", MethodType.methodType(void.class, InputStream.class, JarOutputStream.class)); - unpackFile = lookup.findVirtual(unpackerClass, "unpack", MethodType.methodType(void.class, File.class, JarOutputStream.class)); - } catch (Throwable e) { - LOG.warning("Failed to find pack200 methods", e); - } - - if (newUnpacker != null) { - newUnpackerHandle = newUnpacker; - unpackHandle = unpack; - unpackFileHandle = unpackFile; - } else { - newUnpackerHandle = null; - unpackHandle = null; - unpackFileHandle = null; - } - } - - } - - public static boolean isSupported() { - return newUnpackerHandle != null; - } - - public static void unpack(InputStream in, JarOutputStream out) throws IOException { - if (newUnpackerHandle == null) { - throw new UnsupportedOperationException("Pack200"); - } - - try { - unpackHandle.invoke(newUnpackerHandle.invoke(), in, out); - } catch (IOException | RuntimeException | Error e) { - throw e; - } catch (Throwable e) { - throw new RuntimeException(e); - } - } - - public static void unpack(File in, JarOutputStream out) throws IOException { - if (newUnpackerHandle == null) { - throw new UnsupportedOperationException("Pack200"); - } - - try { - unpackFileHandle.invoke(newUnpackerHandle.invoke(), in, out); - } catch (IOException | RuntimeException | Error e) { - throw e; - } catch (Throwable e) { - throw new RuntimeException(e); - } - } -}