diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java index 7438d0dc2c0..36931c3dc2a 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java @@ -116,6 +116,10 @@ public String toSnippet() { if (isPom() || gradleConfiguration == INTEGRATION_TEST_IMPLEMENTATION_TEST_FIXTURES) { snippet += ")"; } + if (getArtifactId() == "spring-boot-devtools") { + snippet += " // Spring Boot DevTools may cause performance slowdowns or compatibility issues on larger applications"; + } + return snippet; } } diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java index 2bbf2d46278..0d00c67a03d 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java @@ -19,13 +19,18 @@ package org.grails.forge.feature.reloading; import jakarta.inject.Singleton; +import org.grails.forge.application.ApplicationType; import org.grails.forge.application.generator.GeneratorContext; import org.grails.forge.build.dependencies.Dependency; import org.grails.forge.build.dependencies.Scope; +import org.grails.forge.feature.DefaultFeature; +import org.grails.forge.feature.Feature; +import org.grails.forge.options.Options; +import java.util.Set; @Singleton -public class SpringBootDevTools implements ReloadingFeature { +public class SpringBootDevTools implements ReloadingFeature, DefaultFeature { @Override public String getName() { return "spring-boot-devtools"; @@ -54,8 +59,18 @@ public boolean isVisible() { return true; } + @Override + public boolean shouldApply(ApplicationType applicationType, Options options, Set selectedFeatures) { + return true; + } + + @Override + public boolean supports(ApplicationType applicationType) { + return true; + } + @Override public String getDocumentation() { - return "https://docs.spring.io/spring-boot/docs/2.7.12/reference/htmlsingle/#using.devtools"; + return "https://docs.spring.io/spring-boot/reference/using/devtools.html"; } } diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy index d66d87293fe..243bca2f2b2 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy @@ -842,6 +842,11 @@ class GrailsGradlePlugin extends GroovyPlugin { SourceSet mainSourceSet = SourceSets.findMainSourceSet(project) it.classpath = mainSourceSet.runtimeClasspath + project.configurations.getByName('console') it.systemProperty(Environment.KEY, System.getProperty(Environment.KEY, Environment.DEVELOPMENT.getName())) + + // devtools' automatic restart mechanism uses a specialized classloader setup, which can interfere + // with Grails' plugin management and bean wiring when running CLI scripts via Gradle + it.systemProperty 'spring.devtools.restart.enabled', 'false' + List args = [] def otherArgs = project.findProperty('args') if (otherArgs) { @@ -869,6 +874,10 @@ class GrailsGradlePlugin extends GroovyPlugin { it.classpath = mainSourceSet.runtimeClasspath + project.configurations.getByName('console') it.systemProperty(Environment.KEY, System.getProperty(Environment.KEY, Environment.DEVELOPMENT.getName())) + // devtools' automatic restart mechanism uses a specialized classloader setup, which can interfere + // with Grails' plugin management and bean wiring when running CLI commands via Gradle + it.systemProperty 'spring.devtools.restart.enabled', 'false' + List args = [] def otherArgs = project.findProperty('args') if (otherArgs) {