mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-17 07:47:57 -04:00
移除 Pack200 支持 (#4267)
This commit is contained in:
parent
4445021d66
commit
a4f9438d9e
@ -151,7 +151,6 @@ tasks.shadowJar {
|
|||||||
"CurseForge-Api-Key" to curseForgeApiKey,
|
"CurseForge-Api-Key" to curseForgeApiKey,
|
||||||
"Authlib-Injector-Version" to libs.authlib.injector.get().version!!,
|
"Authlib-Injector-Version" to libs.authlib.injector.get().version!!,
|
||||||
"Build-Channel" to versionType,
|
"Build-Channel" to versionType,
|
||||||
"Class-Path" to "pack200.jar",
|
|
||||||
"Add-Opens" to listOf(
|
"Add-Opens" to listOf(
|
||||||
"java.base/java.lang",
|
"java.base/java.lang",
|
||||||
"java.base/java.lang.reflect",
|
"java.base/java.lang.reflect",
|
||||||
|
@ -18,14 +18,9 @@
|
|||||||
package org.jackhuang.hmcl.upgrade;
|
package org.jackhuang.hmcl.upgrade;
|
||||||
|
|
||||||
import org.jackhuang.hmcl.task.FileDownloadTask;
|
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.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.jar.JarOutputStream;
|
|
||||||
|
|
||||||
final class HMCLDownloadTask extends FileDownloadTask {
|
final class HMCLDownloadTask extends FileDownloadTask {
|
||||||
|
|
||||||
@ -45,15 +40,6 @@ final class HMCLDownloadTask extends FileDownloadTask {
|
|||||||
switch (archiveFormat) {
|
switch (archiveFormat) {
|
||||||
case JAR:
|
case JAR:
|
||||||
break;
|
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:
|
default:
|
||||||
throw new IllegalArgumentException("Unknown format: " + archiveFormat);
|
throw new IllegalArgumentException("Unknown format: " + archiveFormat);
|
||||||
}
|
}
|
||||||
|
@ -21,14 +21,13 @@ import com.google.gson.JsonElement;
|
|||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck;
|
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.gson.JsonUtils;
|
||||||
import org.jackhuang.hmcl.util.io.NetworkUtils;
|
import org.jackhuang.hmcl.util.io.NetworkUtils;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class RemoteVersion {
|
public final class RemoteVersion {
|
||||||
|
|
||||||
public static RemoteVersion fetch(UpdateChannel channel, String url) throws IOException {
|
public static RemoteVersion fetch(UpdateChannel channel, String url) throws IOException {
|
||||||
try {
|
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 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 jarUrl = Optional.ofNullable(response.get("jar")).map(JsonElement::getAsString).orElse(null);
|
||||||
String jarHash = Optional.ofNullable(response.get("jarsha1")).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);
|
boolean force = Optional.ofNullable(response.get("force")).map(JsonElement::getAsBoolean).orElse(false);
|
||||||
if (Pack200Utils.isSupported() && packXZUrl != null && packXZHash != null) {
|
if (jarUrl != null && jarHash != null) {
|
||||||
return new RemoteVersion(channel, version, packXZUrl, Type.PACK_XZ, new IntegrityCheck("SHA-1", packXZHash), force);
|
|
||||||
} else if (jarUrl != null && jarHash != null) {
|
|
||||||
return new RemoteVersion(channel, version, jarUrl, Type.JAR, new IntegrityCheck("SHA-1", jarHash), force);
|
return new RemoteVersion(channel, version, jarUrl, Type.JAR, new IntegrityCheck("SHA-1", jarHash), force);
|
||||||
} else {
|
} else {
|
||||||
throw new IOException("No download url is available");
|
throw new IOException("No download url is available");
|
||||||
@ -97,7 +92,6 @@ public class RemoteVersion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
PACK_XZ,
|
|
||||||
JAR
|
JAR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,122 +0,0 @@
|
|||||||
/*
|
|
||||||
* Hello Minecraft! Launcher
|
|
||||||
* Copyright (C) 2021 huangyuhui <huanghongxun2008@126.com> 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 <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user