From 9882543bfebd98f387228f218bced53cbf714480 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 16 Sep 2026 11:58:50 +0100 Subject: [PATCH 1/2] Remove usage of getGradle().getPlugins() Attempting to access the global Gradle plugins fails when running with isolated projects. Instead of checking for a marker plugin on the Gradle object, we now install a marker plugin on every project. --- .../internal/LegacyForgeModDevPlugin.java | 2 +- .../internal/LegacyRepositoriesPlugin.java | 13 +++++++- .../moddevgradle/internal/ModDevPlugin.java | 2 +- .../internal/RepositoriesPlugin.java | 13 +++++++- .../functional/GroovyScriptTest.java | 30 +++++++++++++++++++ 5 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java index a3f7ef17..2f5ebe2c 100644 --- a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java +++ b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java @@ -61,7 +61,7 @@ public void apply(Project project) { // Do not apply the repositories automatically if they have been applied at the settings-level. // It's still possible to apply them manually, though. - if (!project.getGradle().getPlugins().hasPlugin(LegacyRepositoriesPlugin.class)) { + if (!project.getPlugins().hasPlugin(LegacyRepositoriesPlugin.DeclaredInSettingsPlugin.class)) { project.getPlugins().apply(LegacyRepositoriesPlugin.class); } else { LOG.info("Not enabling legacy repositories since they were applied at the settings level"); diff --git a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java index 20e5d2a7..2e134fdf 100644 --- a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java +++ b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java @@ -22,7 +22,9 @@ public void apply(PluginAware target) { applyRepositories(project.getRepositories()); } else if (target instanceof Settings settings) { applyRepositories(settings.getDependencyResolutionManagement().getRepositories()); - settings.getGradle().getPlugins().apply(getClass()); // Add a marker to Gradle + + // Apply our marker plugin to all projects. + settings.getGradle().beforeProject(project -> project.getPluginManager().apply(DeclaredInSettingsPlugin.class)); } else if (target instanceof Gradle gradle) { // Do nothing } else { @@ -30,6 +32,15 @@ public void apply(PluginAware target) { } } + /** + * A marker plugin applied to each project, indicating this plugin was applied on the settings level. + */ + public static final class DeclaredInSettingsPlugin implements Plugin { + @Override + public void apply(Project target) { + } + } + private void applyRepositories(RepositoryHandler repositories) { repositories.maven(repo -> { repo.setName("MinecraftForge"); diff --git a/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java b/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java index 97f0e7f5..edd22264 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java @@ -30,7 +30,7 @@ public void apply(Project project) { // Do not apply the repositories automatically if they have been applied at the settings-level. // It's still possible to apply them manually, though. - if (!project.getGradle().getPlugins().hasPlugin(RepositoriesPlugin.class)) { + if (!project.getPlugins().hasPlugin(RepositoriesPlugin.DeclaredInSettingsPlugin.class)) { project.getPlugins().apply(RepositoriesPlugin.class); } else { LOG.info("Not enabling NeoForged repositories since they were applied at the settings level"); diff --git a/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java b/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java index ec296a1a..ce608de5 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java @@ -26,7 +26,9 @@ public void apply(PluginAware target) { applyRepositories(project.getRepositories()); } else if (target instanceof Settings settings) { applyRepositories(settings.getDependencyResolutionManagement().getRepositories()); - settings.getGradle().getPlugins().apply(getClass()); // Add a marker to Gradle + + // Apply our marker plugin to all projects. + settings.getGradle().beforeProject(project -> project.getPluginManager().apply(DeclaredInSettingsPlugin.class)); } else if (target instanceof Gradle gradle) { // Do nothing } else { @@ -34,6 +36,15 @@ public void apply(PluginAware target) { } } + /** + * A marker plugin applied to each project, indicating this plugin was applied on the settings level. + */ + public static final class DeclaredInSettingsPlugin implements Plugin { + @Override + public void apply(Project target) { + } + } + private void applyRepositories(RepositoryHandler repositories) { var mojangMaven = repositories.maven(repo -> { repo.setName("Mojang Minecraft Libraries"); diff --git a/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java b/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java index 7ab4201f..1594e7bc 100644 --- a/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java +++ b/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java @@ -51,4 +51,34 @@ public void testApplyInEmptyProjectAndEnable() throws IOException { assertThat(result.getOutput()).contains("createMinecraftArtifacts"); assertEquals(TaskOutcome.SUCCESS, result.task(":tasks").getOutcome()); } + + @Test + public void testApplyInSettings() throws IOException { + writeFile(settingsFile, """ + plugins { + id "net.neoforged.moddev.repositories" + } + + rootProject.name = 'hello-world' + + dependencyResolutionManagement { + repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS + } + """); + String buildFileContent = """ + plugins { + id "net.neoforged.moddev" + } + """; + writeFile(buildFile, buildFileContent); + + BuildResult result = GradleRunner.create() + .withPluginClasspath() + .withProjectDir(testProjectDir) + .withArguments("tasks", "--all", "-i") + .build(); + + assertThat(result.getOutput()).contains("Not enabling NeoForged repositories since they were applied at the settings level"); + assertEquals(TaskOutcome.SUCCESS, result.task(":tasks").getOutcome()); + } } From b30a57c12531328e2d6be26dd41606a19bd15c82 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 16 Sep 2026 12:42:47 +0100 Subject: [PATCH 2/2] Immaculate --- .../internal/LegacyRepositoriesPlugin.java | 3 +-- .../internal/RepositoriesPlugin.java | 3 +-- .../functional/GroovyScriptTest.java | 24 +++++++++---------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java index 2e134fdf..0a0bb1bf 100644 --- a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java +++ b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java @@ -37,8 +37,7 @@ public void apply(PluginAware target) { */ public static final class DeclaredInSettingsPlugin implements Plugin { @Override - public void apply(Project target) { - } + public void apply(Project target) {} } private void applyRepositories(RepositoryHandler repositories) { diff --git a/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java b/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java index ce608de5..47f82f4b 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java @@ -41,8 +41,7 @@ public void apply(PluginAware target) { */ public static final class DeclaredInSettingsPlugin implements Plugin { @Override - public void apply(Project target) { - } + public void apply(Project target) {} } private void applyRepositories(RepositoryHandler repositories) { diff --git a/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java b/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java index 1594e7bc..02992c47 100644 --- a/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java +++ b/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java @@ -55,16 +55,16 @@ public void testApplyInEmptyProjectAndEnable() throws IOException { @Test public void testApplyInSettings() throws IOException { writeFile(settingsFile, """ - plugins { - id "net.neoforged.moddev.repositories" - } + plugins { + id "net.neoforged.moddev.repositories" + } - rootProject.name = 'hello-world' + rootProject.name = 'hello-world' - dependencyResolutionManagement { - repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS - } - """); + dependencyResolutionManagement { + repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS + } + """); String buildFileContent = """ plugins { id "net.neoforged.moddev" @@ -73,10 +73,10 @@ public void testApplyInSettings() throws IOException { writeFile(buildFile, buildFileContent); BuildResult result = GradleRunner.create() - .withPluginClasspath() - .withProjectDir(testProjectDir) - .withArguments("tasks", "--all", "-i") - .build(); + .withPluginClasspath() + .withProjectDir(testProjectDir) + .withArguments("tasks", "--all", "-i") + .build(); assertThat(result.getOutput()).contains("Not enabling NeoForged repositories since they were applied at the settings level"); assertEquals(TaskOutcome.SUCCESS, result.task(":tasks").getOutcome());