Fix run tasks in Gradle 8.1 (#863)

This commit is contained in:
modmuss50
2023-04-16 23:23:44 +01:00
committed by GitHub
parent 4ff9f726e1
commit 11f69ccbf0
2 changed files with 54 additions and 4 deletions

View File

@@ -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<Project, RunConfig> 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<String> jvmArguments = (ListProperty<String>) 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<String> getJvmArgs() {
final List<String> superArgs = super.getJvmArgs();
if (setJvmArgsProperty) {
// Don't do anything here when on Gradle 8.1
return superArgs;
}
final List<String> args = new ArrayList<>(getGameJvmArgs());
if (superArgs != null) {
args.addAll(superArgs);
}
return args;
}
private List<String> getGameJvmArgs() {
final List<String> 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;
}

View File

@@ -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;
}
}
}