diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java
index 1f6f73ef..1783e903 100644
--- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java
+++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java
@@ -138,10 +138,10 @@ public class RunConfig {
String environment = settings.getEnvironment();
SourceSet sourceSet = settings.getSource(project);
- String defaultMain = settings.getDefaultMainClass();
+ String mainClass = settings.getMainClass().getOrNull();
- if (defaultMain == null) {
- throw new IllegalArgumentException("Run configuration '" + name + "' must specify 'defaultMainClass'");
+ if (mainClass == null) {
+ throw new IllegalArgumentException("Run configuration '" + name + "' must specify 'mainClass'");
}
if (configName == null) {
@@ -179,7 +179,7 @@ public class RunConfig {
// Custom parameters
runConfig.programArgs.addAll(settings.getProgramArgs());
runConfig.vmArgs.addAll(settings.getVmArgs());
- runConfig.vmArgs.add("-Dfabric.dli.main=" + getMainClass(environment, extension, defaultMain));
+ runConfig.vmArgs.add("-Dfabric.dli.main=" + mainClass);
runConfig.environmentVariables = new HashMap<>();
runConfig.environmentVariables.putAll(settings.getEnvironmentVariables());
runConfig.projectName = project.getName();
@@ -245,7 +245,7 @@ public class RunConfig {
return sb.toString();
}
- private static String getMainClass(String side, LoomGradleExtension extension, String defaultMainClass) {
+ static String getMainClass(String side, LoomGradleExtension extension, String defaultMainClass) {
InstallerData installerData = extension.getInstallerData();
if (installerData == null) {
diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java
index 4447c152..82bfeeec 100644
--- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java
+++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java
@@ -1,7 +1,7 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
- * Copyright (c) 2021 FabricMC
+ * Copyright (c) 2021-2023 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -31,10 +31,12 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.function.Function;
import org.gradle.api.Named;
import org.gradle.api.Project;
+import org.gradle.api.provider.Property;
import org.gradle.api.tasks.SourceSet;
import net.fabricmc.loom.LoomGradleExtension;
@@ -74,6 +76,14 @@ public final class RunConfigSettings implements Named {
*/
private String defaultMainClass;
+ /**
+ * The main class of the run configuration.
+ *
+ *
If unset, {@link #defaultMainClass} is used as the fallback, including the overwritten main class
+ * from installer files.
+ */
+ private final Property mainClass;
+
/**
* The source set getter, which obtains the source set from the given project.
*/
@@ -106,6 +116,11 @@ public final class RunConfigSettings implements Named {
this.project = project;
this.extension = LoomGradleExtension.get(project);
this.ideConfigGenerated = extension.isRootProject();
+ this.mainClass = project.getObjects().property(String.class).convention(project.provider(() -> {
+ Objects.requireNonNull(environment, "Run config " + baseName + " must specify environment");
+ Objects.requireNonNull(defaultMainClass, "Run config " + baseName + " must specify default main class");
+ return RunConfig.getMainClass(environment, extension, defaultMainClass);
+ }));
setSource(p -> {
final String sourceSetName = MinecraftSourceSets.get(p).getSourceSetForEnv(getEnvironment());
@@ -160,6 +175,16 @@ public final class RunConfigSettings implements Named {
this.defaultMainClass = defaultMainClass;
}
+ /**
+ * The main class of the run configuration.
+ *
+ * If unset, {@link #getDefaultMainClass defaultMainClass} is used as the fallback,
+ * including the overwritten main class from installer files.
+ */
+ public Property getMainClass() {
+ return mainClass;
+ }
+
public String getRunDir() {
return runDir;
}
diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/RunConfigTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/RunConfigTest.groovy
index 38438e8b..770a7b23 100644
--- a/src/test/groovy/net/fabricmc/loom/test/integration/RunConfigTest.groovy
+++ b/src/test/groovy/net/fabricmc/loom/test/integration/RunConfigTest.groovy
@@ -1,7 +1,7 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
- * Copyright (c) 2018-2021 FabricMC
+ * Copyright (c) 2018-2023 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -59,6 +59,22 @@ class RunConfigTest extends Specification implements GradleProjectTestTrait {
task << tasks * STANDARD_TEST_VERSIONS.size()
}
+ @Unroll
+ def "Custom main class (gradle #version)"() {
+ setup:
+ def gradle = gradleProject(project: "runconfigs", sharedFiles: true, version: version)
+
+ when:
+ def result = gradle.run(task: 'runCustomMain')
+
+ then:
+ result.task(':runCustomMain').outcome == SUCCESS
+ result.output.contains('hello custom main')
+
+ where:
+ version << STANDARD_TEST_VERSIONS
+ }
+
@RestoreSystemProperties
@Unroll
def "idea auto configuration (gradle #version)"() {
diff --git a/src/test/resources/projects/runconfigs/build.gradle b/src/test/resources/projects/runconfigs/build.gradle
index 3dfb3603..5e504e20 100644
--- a/src/test/resources/projects/runconfigs/build.gradle
+++ b/src/test/resources/projects/runconfigs/build.gradle
@@ -20,6 +20,11 @@ loom {
inherit testmodServer
vmArg "-Dfabric.autoTest"
}
+ customMain {
+ inherit server
+ name = 'Custom Main Class'
+ mainClass.set 'net.fabricmc.example.Main'
+ }
}
runConfigs.configureEach {
diff --git a/src/test/resources/projects/runconfigs/src/main/java/net/fabricmc/example/Main.java b/src/test/resources/projects/runconfigs/src/main/java/net/fabricmc/example/Main.java
new file mode 100644
index 00000000..3b79a86c
--- /dev/null
+++ b/src/test/resources/projects/runconfigs/src/main/java/net/fabricmc/example/Main.java
@@ -0,0 +1,10 @@
+package net.fabricmc.example;
+
+import net.fabricmc.loader.impl.launch.knot.KnotServer;
+
+public class Main {
+ public static void main(String[] args) {
+ System.out.println("hello custom main");
+ KnotServer.main(args);
+ }
+}