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); + } +}