From 4b14673aaffef8bd7fdee93fca1a25b52fdf9468 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 1 Jan 2023 14:35:55 +0800 Subject: [PATCH] Update JavaFXPatcher (#1955) --- HMCL/build.gradle.kts | 20 +++---- .../jackhuang/hmcl/util/JavaFXPatcher.java | 2 +- .../hmcl/util/SelfDependencyPatcher.java | 5 +- .../jackhuang/hmcl/util/JavaFXPatcher.java | 52 +++++-------------- 4 files changed, 24 insertions(+), 55 deletions(-) diff --git a/HMCL/build.gradle.kts b/HMCL/build.gradle.kts index ecc6d792d..dff679e41 100644 --- a/HMCL/build.gradle.kts +++ b/HMCL/build.gradle.kts @@ -154,23 +154,15 @@ tasks.getByName("sha "Add-Opens" to listOf( "java.base/java.lang", "java.base/java.lang.reflect", - "javafx.graphics/javafx.css", - "javafx.base/com.sun.javafx.runtime", - "javafx.controls/com.sun.javafx.scene.control.behavior", - "javafx.controls/javafx.scene.control.skin", - "javafx.controls/com.sun.javafx.scene.control", + "java.base/jdk.internal.loader", "javafx.base/com.sun.javafx.binding", "javafx.base/com.sun.javafx.event", - "javafx.graphics/com.sun.javafx.stage" - ).joinToString(" "), - "Add-Exports" to listOf( - "java.base/jdk.internal.loader", - "javafx.controls/com.sun.javafx.scene.control.behavior", - "javafx.controls/javafx.scene.control.skin", - "javafx.controls/com.sun.javafx.scene.control", - "javafx.base/com.sun.javafx.binding", + "javafx.base/com.sun.javafx.runtime", + "javafx.graphics/javafx.css", "javafx.graphics/com.sun.javafx.stage", - "javafx.base/com.sun.javafx.event" + "javafx.controls/com.sun.javafx.scene.control", + "javafx.controls/com.sun.javafx.scene.control.behavior", + "javafx.controls/javafx.scene.control.skin" ).joinToString(" ") ) } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java index 908bf171e..cb7efb4cb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java @@ -31,7 +31,7 @@ public final class JavaFXPatcher { private JavaFXPatcher() { } - public static void patch(Set modules, Path... jarPaths) { + public static void patch(Set modules, Path[] jarPaths, String[] addOpens) { LOG.info("No need to patch JavaFX with Java 8"); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java index c3b892fd8..3a504139f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java @@ -46,6 +46,7 @@ import com.google.gson.reflect.TypeToken; import org.jackhuang.hmcl.ui.SwingUtils; import org.jackhuang.hmcl.util.io.ChecksumMismatchException; import org.jackhuang.hmcl.util.io.IOUtils; +import org.jackhuang.hmcl.util.io.JarUtils; import org.jackhuang.hmcl.util.platform.Platform; import javax.swing.*; @@ -269,7 +270,9 @@ public final class SelfDependencyPatcher { .map(DependencyDescriptor::localPath) .toArray(Path[]::new); - JavaFXPatcher.patch(modules, jars); + String[] addOpens = JarUtils.getManifestAttribute("Add-Opens", "").split(" "); + + JavaFXPatcher.patch(modules, jars, addOpens); } /** diff --git a/HMCL/src/main/java11/org/jackhuang/hmcl/util/JavaFXPatcher.java b/HMCL/src/main/java11/org/jackhuang/hmcl/util/JavaFXPatcher.java index fd848ba41..9eb03d8ed 100644 --- a/HMCL/src/main/java11/org/jackhuang/hmcl/util/JavaFXPatcher.java +++ b/HMCL/src/main/java11/org/jackhuang/hmcl/util/JavaFXPatcher.java @@ -27,8 +27,6 @@ import java.nio.file.Path; import java.util.List; import java.util.Set; -import jdk.internal.loader.BuiltinClassLoader; - /** * Utility for Adding JavaFX to module path. * @@ -38,26 +36,6 @@ public final class JavaFXPatcher { private JavaFXPatcher() { } - private static final String[] addOpens = { - "javafx.base/com.sun.javafx.runtime", - "javafx.base/com.sun.javafx.binding", - "javafx.base/com.sun.javafx.event", - "javafx.graphics/javafx.css", - "javafx.graphics/com.sun.javafx.stage", - "javafx.controls/com.sun.javafx.scene.control.behavior", - "javafx.controls/javafx.scene.control.skin", - "javafx.controls/com.sun.javafx.scene.control" - }; - - private static final String[] addExports = { - "javafx.base/com.sun.javafx.binding", - "javafx.base/com.sun.javafx.event", - "javafx.graphics/com.sun.javafx.stage", - "javafx.controls/com.sun.javafx.scene.control.behavior", - "javafx.controls/javafx.scene.control.skin", - "javafx.controls/com.sun.javafx.scene.control" - }; - /** * Add JavaFX to module path at runtime. * @@ -65,13 +43,13 @@ public final class JavaFXPatcher { * @param jarPaths All jar paths * @throws ReflectiveOperationException When the call to add these jars to the system module path failed. */ - public static void patch(Set modules, Path... jarPaths) throws ReflectiveOperationException { + public static void patch(Set modules, Path[] jarPaths, String[] addOpens) throws ReflectiveOperationException { // Find all modules ModuleFinder finder = ModuleFinder.of(jarPaths); // Load all modules as unnamed module for (ModuleReference mref : finder.findAll()) { - ((BuiltinClassLoader) ClassLoader.getSystemClassLoader()).loadModule(mref); + ((jdk.internal.loader.BuiltinClassLoader) ClassLoader.getSystemClassLoader()).loadModule(mref); } // Define all modules @@ -82,23 +60,19 @@ public final class JavaFXPatcher { try { // Some hacks MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(Module.class, MethodHandles.lookup()); - addExportsOrOpens(addExports, layer, lookup.findVirtual(Module.class, "implAddExportsToAllUnnamed", MethodType.methodType(void.class, String.class))); - addExportsOrOpens(addOpens, layer, lookup.findVirtual(Module.class, "implAddOpensToAllUnnamed", MethodType.methodType(void.class, String.class))); + MethodHandle handle = lookup.findVirtual(Module.class, "implAddOpensToAllUnnamed", MethodType.methodType(void.class, String.class)); + for (String target : addOpens) { + String[] name = target.split("/", 2); // / + layer.findModule(name[0]).ifPresent(m -> { + try { + handle.invokeWithArguments(m, name[1]); + } catch (Throwable throwable) { + throw new RuntimeException(throwable); + } + }); + } } catch (Throwable t) { throw new ReflectiveOperationException(t); } } - - private static void addExportsOrOpens(String[] targets, ModuleLayer layer, MethodHandle handle) { - for (String target : targets) { - String[] name = target.split("/", 2); // / - layer.findModule(name[0]).ifPresent(m -> { - try { - handle.invokeWithArguments(m, name[1]); - } catch (Throwable throwable) { - throw new RuntimeException(throwable); - } - }); - } - } }