From 11f69ccbf0ed5660a3cf547685e2e2fc28581835 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sun, 16 Apr 2023 23:23:44 +0100 Subject: [PATCH] Fix run tasks in Gradle 8.1 (#863) --- .../fabricmc/loom/task/AbstractRunTask.java | 38 +++++++++++++++++-- .../loom/util/gradle/GradleUtils.java | 20 ++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java index 88767e70..db24f740 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java @@ -38,18 +38,23 @@ import java.util.stream.Collectors; import org.gradle.api.Project; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; +import org.gradle.api.provider.ListProperty; import org.gradle.api.specs.Spec; import org.gradle.api.tasks.JavaExec; import org.jetbrains.annotations.NotNull; import net.fabricmc.loom.configuration.ide.RunConfig; import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.gradle.GradleUtils; public abstract class AbstractRunTask extends JavaExec { private final RunConfig config; // We control the classpath, as we use a ArgFile to pass it over the command line: https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#commandlineargfile private final ConfigurableFileCollection classpath = getProject().getObjects().fileCollection(); + // TODO remove when updating loom to Gradle 8.1 + private static final boolean setJvmArgsProperty = GradleUtils.JavaExecSpec_getJvmArguments != null; + public AbstractRunTask(Function configProvider) { super(); setGroup(Constants.TaskGroup.FABRIC); @@ -59,6 +64,18 @@ public abstract class AbstractRunTask extends JavaExec { args(config.programArgs); getMainClass().set(config.mainClass); + + // TODO replace with a direct call when updating loom to Gradle 8.1 + if (setJvmArgsProperty) { + try { + assert GradleUtils.JavaExecSpec_getJvmArguments != null; + //noinspection unchecked + ListProperty jvmArguments = (ListProperty) GradleUtils.JavaExecSpec_getJvmArguments.invoke(this); + jvmArguments.addAll(getProject().provider(this::getGameJvmArgs)); + } catch (Throwable e) { + throw new RuntimeException("Failed to set jvm args", e); + } + } } private boolean canUseArgFile() { @@ -94,8 +111,25 @@ public abstract class AbstractRunTask extends JavaExec { } @Override + // TODO remove when updating loom to Gradle 8.1 public List getJvmArgs() { final List superArgs = super.getJvmArgs(); + + if (setJvmArgsProperty) { + // Don't do anything here when on Gradle 8.1 + return superArgs; + } + + final List args = new ArrayList<>(getGameJvmArgs()); + + if (superArgs != null) { + args.addAll(superArgs); + } + + return args; + } + + private List getGameJvmArgs() { final List args = new ArrayList<>(); if (canUseArgFile()) { @@ -113,10 +147,6 @@ public abstract class AbstractRunTask extends JavaExec { } } - if (superArgs != null) { - args.addAll(superArgs); - } - args.addAll(config.vmArgs); return args; } diff --git a/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java b/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java index 7fd5d159..c529607c 100644 --- a/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java +++ b/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java @@ -24,13 +24,24 @@ package net.fabricmc.loom.util.gradle; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.util.function.Consumer; +import javax.annotation.Nullable; + import org.gradle.api.Project; import org.gradle.api.invocation.Gradle; +import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.JavaExec; public final class GradleUtils { + @Nullable + // TODO remove when updating loom to Gradle 8.1 + public static final MethodHandle JavaExecSpec_getJvmArguments = getJavaExecSpec_getJvmArguments(); + private GradleUtils() { } @@ -71,4 +82,13 @@ public final class GradleUtils { public static boolean getBooleanProperty(Project project, String key) { return getBooleanPropertyProvider(project, key).getOrElse(false); } + + // TODO remove when updating loom to Gradle 8.1 + private static MethodHandle getJavaExecSpec_getJvmArguments() { + try { + return MethodHandles.publicLookup().findVirtual(JavaExec.class, "getJvmArguments", MethodType.methodType(ListProperty.class)); + } catch (NoSuchMethodException | IllegalAccessException ignored) { + return null; + } + } }