From 8c936820d7f5ce3ee8b5aeb752a0461e38a6019f Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sat, 4 Jan 2025 03:32:27 +0100 Subject: [PATCH 1/2] Support Java Agents published by the platform --- .../internal/ModDevRunWorkflow.java | 21 +++++++++++++++++-- .../internal/ModdingDependencies.java | 6 ++++++ .../moddevgradle/internal/NeoDevFacade.java | 3 ++- .../internal/PrepareRunOrTest.java | 8 +++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/neoforged/moddevgradle/internal/ModDevRunWorkflow.java b/src/main/java/net/neoforged/moddevgradle/internal/ModDevRunWorkflow.java index 246f6212..60a74f3a 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/ModDevRunWorkflow.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/ModDevRunWorkflow.java @@ -27,6 +27,7 @@ import org.gradle.api.attributes.Usage; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.Directory; +import org.gradle.api.file.FileCollection; import org.gradle.api.file.RegularFile; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; @@ -61,6 +62,7 @@ public class ModDevRunWorkflow { private final ModuleDependency gameLibrariesDependency; private final Configuration additionalClasspath; private final Configuration userDevConfigOnly; + private final Configuration javaAgent; /** * @param gameLibrariesDependency A module dependency that represents the library dependencies of the game. @@ -74,6 +76,7 @@ private ModDevRunWorkflow(Project project, @Nullable ModuleDependency modulePathDependency, @Nullable ModuleDependency runTypesConfigDependency, @Nullable ModuleDependency testFixturesDependency, + @Nullable ModuleDependency javaAgentDependency, ModuleDependency gameLibrariesDependency, DomainObjectCollection runs, VersionCapabilitiesInternal versionCapabilities) { @@ -97,6 +100,16 @@ private ModDevRunWorkflow(Project project, } }); + javaAgent = configurations.create("neoForgeJavaAgent", spec -> { + spec.setDescription("Any jar in this configuration will be added as a javagent to the Minecraft and JUnit command lines in this project."); + spec.setCanBeResolved(true); + spec.setCanBeConsumed(false); + spec.setTransitive(false); // Java agents can't load transitive dependencies + if (javaAgentDependency != null) { + spec.getDependencies().add(javaAgentDependency); + } + }); + additionalClasspath = configurations.create("additionalRuntimeClasspath", spec -> { spec.setDescription("Contains dependencies of every run, that should not be considered boot classpath modules."); spec.setCanBeResolved(true); @@ -149,6 +162,7 @@ public static ModDevRunWorkflow create(Project project, dependencies.modulePathDependency(), dependencies.runTypesConfigDependency(), dependencies.testFixturesDependency(), + dependencies.javaAgentDependency(), dependencies.gameLibrariesDependency(), runs, versionCapabilites); @@ -198,7 +212,8 @@ public void configureTesting(Provider testedMod, Provider argFileDir, Consumer configureModulePath, Consumer configureLegacyClasspath, - Provider assetPropertiesFile) { + Provider assetPropertiesFile, + FileCollection javaAgent) { var gameDirectory = new File(project.getProjectDir(), JUNIT_GAME_DIR); var ideIntegration = IdeIntegration.of(project, branding); @@ -455,6 +471,7 @@ static void setupTestTask(Project project, task.getProgramArgsFile().set(programArgsFile); task.getLog4jConfigFile().set(log4j2ConfigFile); task.getRunTypeTemplatesSource().from(runTemplatesSourceFile); + task.getJavaAgent().from(javaAgent); task.getModules().from(neoForgeModDevModules); task.getLegacyClasspathFile().set(writeLcpTask.get().getLegacyClasspathFile()); task.getAssetProperties().set(assetPropertiesFile); diff --git a/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java b/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java index 2a26d6be..0f8711c6 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java @@ -11,6 +11,7 @@ public record ModdingDependencies( @Nullable ModuleDependency neoFormDependency, @Nullable String neoFormDependencyNotation, ModuleDependency gameLibrariesDependency, + @Nullable ModuleDependency javaAgentDependency, @Nullable ModuleDependency modulePathDependency, @Nullable ModuleDependency runTypesConfigDependency, @Nullable ModuleDependency testFixturesDependency) { @@ -34,12 +35,16 @@ public static ModdingDependencies create(ModuleDependency neoForge, .capabilities(caps -> caps.requireCapability("net.neoforged:neoforge-moddev-test-fixtures")); } + var javaAgentDependency = neoForge.copy() + .capabilities(caps -> caps.requireCapability("net.neoforged:neoforge-javaagent")); + return new ModdingDependencies( neoForge, neoForgeNotation, neoForm, neoFormNotation, librariesDependency, + javaAgentDependency, modulePathDependency, runTypesDataDependency, testFixturesDependency); @@ -57,6 +62,7 @@ public static ModdingDependencies createVanillaOnly(ModuleDependency neoForm, St librariesDependency, null, null, + null, null); } } diff --git a/src/main/java/net/neoforged/moddevgradle/internal/NeoDevFacade.java b/src/main/java/net/neoforged/moddevgradle/internal/NeoDevFacade.java index 272dfe3f..2501a006 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/NeoDevFacade.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/NeoDevFacade.java @@ -83,7 +83,8 @@ public static void setupTestTask(Project project, argFileDir, configureModulePath, configureAdditionalClasspath, - assetPropertiesFile); + assetPropertiesFile, + project.files()); } public static void runTaskOnProjectSync(Project project, Object task) { diff --git a/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java b/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java index 4270cb73..8b5e3339 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java @@ -82,6 +82,10 @@ abstract class PrepareRunOrTest extends DefaultTask { @InputFiles abstract ConfigurableFileCollection getModules(); + @Classpath + @InputFiles + abstract ConfigurableFileCollection getJavaAgent(); + @Input public abstract MapProperty getSystemProperties(); @@ -224,6 +228,10 @@ private UserDevConfig getSimulatedUserDevConfigForVanilla() { private void writeJvmArguments(UserDevRunType runConfig, Map additionalProperties) throws IOException { var lines = new ArrayList(); + for (var file : getJavaAgent()) { + lines.add("-javaagent:" + file.getAbsolutePath()); + } + lines.addAll(getInterpolatedJvmArgs(runConfig)); var userJvmArgs = getJvmArguments().get(); From 84427f91f6dc2f9e2f8eb62f9ebde56bb728a6dd Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sat, 4 Jan 2025 03:50:56 +0100 Subject: [PATCH 2/2] Support Java Agents published by the platform --- .../internal/ModdingDependencies.java | 7 +++++-- .../utils/VersionCapabilitiesInternal.java | 17 ++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java b/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java index 0f8711c6..b04be69b 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/ModdingDependencies.java @@ -35,8 +35,11 @@ public static ModdingDependencies create(ModuleDependency neoForge, .capabilities(caps -> caps.requireCapability("net.neoforged:neoforge-moddev-test-fixtures")); } - var javaAgentDependency = neoForge.copy() - .capabilities(caps -> caps.requireCapability("net.neoforged:neoforge-javaagent")); + ModuleDependency javaAgentDependency = null; + if (versionCapabilities.javaAgent()) { + javaAgentDependency = neoForge.copy() + .capabilities(caps -> caps.requireCapability("net.neoforged:neoforge-javaagent")); + } return new ModdingDependencies( neoForge, diff --git a/src/main/java/net/neoforged/moddevgradle/internal/utils/VersionCapabilitiesInternal.java b/src/main/java/net/neoforged/moddevgradle/internal/utils/VersionCapabilitiesInternal.java index c90d506a..f3400c4f 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/utils/VersionCapabilitiesInternal.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/utils/VersionCapabilitiesInternal.java @@ -14,9 +14,12 @@ * @param javaVersion Which Java version Vanilla uses to compile and run. * @param splitDataRuns Whether Vanilla has separate main classes for generating client and server data. * @param testFixtures If the NeoForge version for this Minecraft version supports test fixtures. + * @param modLocatorRework Has the rework of FML mod locators that allow the client resources to use any jar filename. If false, the client resource jar must be called "client-extra". + * @param javaAgent If true, the NeoForge dependency supplies a java agent capability. */ public record VersionCapabilitiesInternal(String minecraftVersion, int javaVersion, boolean splitDataRuns, - boolean testFixtures, boolean modLocatorRework) implements VersionCapabilities, Serializable { + boolean testFixtures, boolean modLocatorRework, + boolean javaAgent) implements VersionCapabilities, Serializable { private static final Logger LOG = LoggerFactory.getLogger(VersionCapabilitiesInternal.class); @@ -26,6 +29,8 @@ public record VersionCapabilitiesInternal(String minecraftVersion, int javaVersi // Strips NeoForm timestamp suffixes OR dynamic version markers private static final Pattern NEOFORM_PATTERN = Pattern.compile("^(.*)-(?:\\+|\\d{8}\\.\\d{6})$"); + // TODO: Wrong but for testing it's 1.20.1 for now + private static final int MC_1_21_4_INDEX = getReferenceVersionIndex("1.21.1"); private static final int MC_24W45A_INDEX = getReferenceVersionIndex("24w45a"); private static final int MC_1_20_5_INDEX = getReferenceVersionIndex("1.20.5"); private static final int MC_24W14A_INDEX = getReferenceVersionIndex("24w14a"); @@ -56,8 +61,9 @@ public static VersionCapabilitiesInternal ofVersionIndex(int versionIndex, Strin var splitData = hasSplitDataEntrypoints(versionIndex); var testFixtures = hasTestFixtures(versionIndex); var modLocatorRework = hasModLocatorRework(versionIndex); + var javaAgent = hasJavaAgent(versionIndex); - return new VersionCapabilitiesInternal(minecraftVersion, javaVersion, splitData, testFixtures, modLocatorRework); + return new VersionCapabilitiesInternal(minecraftVersion, javaVersion, splitData, testFixtures, modLocatorRework, javaAgent); } static int getJavaVersion(int versionIndex) { @@ -84,6 +90,10 @@ static boolean hasModLocatorRework(int versionIndex) { return versionIndex <= MC_1_20_5_INDEX; } + static boolean hasJavaAgent(int versionIndex) { + return versionIndex <= MC_1_21_4_INDEX; + } + static int indexOfNeoForgeVersion(String version) { // NeoForge omits the "1." at the start of the Minecraft version and just adds an incrementing last digit var matcher = NEOFORGE_PATTERN.matcher(version); @@ -168,6 +178,7 @@ public VersionCapabilitiesInternal withMinecraftVersion(String minecraftVersion) javaVersion, splitDataRuns, testFixtures, - modLocatorRework); + modLocatorRework, + javaAgent); } }