This is an automated email from the ASF dual-hosted git repository.

jdaugherty pushed a commit to branch groovydoc-tool-rewrite
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 17b264ebebbf05fe056e4eaff4af377fca313b4b
Author: James Daugherty <[email protected]>
AuthorDate: Fri May 23 12:13:36 2025 -0400

    WIP groovydoc-tool-rewrite
---
 .gitignore                                         |   1 +
 CONTRIBUTING.md                                    |   4 +-
 buildSrc/build.gradle                              |   2 +
 .../grails/internal/build/GrailsGroovydoc.groovy   | 184 +++++++++++++++++++++
 .../build/GrailsGroovydocParameters.groovy         |  52 ++++++
 .../internal/build/GrailsGroovydocPlugin.groovy    | 132 +++++++++++++++
 .../internal/build/GrailsGroovydocWorker.groovy    |  81 +++++++++
 .../gradle-plugins/grails.groovydoc.properties     |  20 +++
 gradle/docs-config.gradle                          |   2 -
 gradle/docs-dependencies.gradle                    |  85 ----------
 grails-async/core/build.gradle                     |   1 +
 grails-async/gpars/build.gradle                    |   1 +
 grails-async/plugin/build.gradle                   |   1 +
 grails-async/rxjava/build.gradle                   |   1 +
 grails-async/rxjava2/build.gradle                  |   1 +
 grails-async/rxjava3/build.gradle                  |   1 +
 grails-bootstrap/build.gradle                      |   1 +
 grails-cache/build.gradle                          |   1 +
 grails-codecs-core/build.gradle                    |   1 +
 grails-codecs/build.gradle                         |   1 +
 grails-common/build.gradle                         |   1 +
 grails-console/build.gradle                        |   1 +
 grails-controllers/build.gradle                    |   1 +
 grails-converters/build.gradle                     |   1 +
 grails-core/build.gradle                           |   1 +
 grails-data-docs/stage/build.gradle                |  14 +-
 grails-data-hibernate5/boot-plugin/build.gradle    |   1 +
 grails-data-hibernate5/core/build.gradle           |   1 +
 grails-data-hibernate5/docs/build.gradle           |   5 +-
 grails-data-mongodb/boot-plugin/build.gradle       |   1 +
 grails-data-mongodb/bson/build.gradle              |   1 +
 grails-data-mongodb/core/build.gradle              |   1 +
 grails-data-mongodb/docs/build.gradle              |   5 +-
 grails-data-mongodb/ext/build.gradle               |   1 +
 grails-data-mongodb/grails-plugin/build.gradle     |   1 +
 grails-data-mongodb/gson-templates/build.gradle    |   1 +
 grails-data-simple/build.gradle                    |   1 +
 grails-databinding-core/build.gradle               |   1 +
 grails-databinding/build.gradle                    |   1 +
 grails-datamapping-async/build.gradle              |   1 +
 grails-datamapping-core-test/build.gradle          |   1 +
 grails-datamapping-core/build.gradle               |   1 +
 grails-datamapping-rx/build.gradle                 |   1 +
 grails-datamapping-support/build.gradle            |   1 +
 grails-datamapping-tck/build.gradle                |   1 +
 grails-datamapping-validation/build.gradle         |   1 +
 grails-datasource/build.gradle                     |   1 +
 grails-datastore-async/build.gradle                |   1 +
 grails-datastore-core/build.gradle                 |   1 +
 grails-datastore-web/build.gradle                  |   1 +
 grails-doc/build.gradle                            |  13 +-
 grails-domain-class/build.gradle                   |   1 +
 grails-encoder/build.gradle                        |   1 +
 grails-events/compat/build.gradle                  |   1 +
 grails-events/core/build.gradle                    |   1 +
 grails-events/gpars/build.gradle                   |   1 +
 grails-events/plugin/build.gradle                  |   1 +
 grails-events/rxjava/build.gradle                  |   1 +
 grails-events/rxjava2/build.gradle                 |   1 +
 grails-events/rxjava3/build.gradle                 |   1 +
 grails-events/spring/build.gradle                  |   1 +
 grails-events/transforms/build.gradle              |   1 +
 grails-fields/build.gradle                         |   1 +
 .../plugin/core/GrailsPluginGradlePlugin.groovy    |   2 +-
 .../gradle/plugin/doc/GrailsDocGradlePlugin.groovy |  30 ++--
 .../publishing/GrailsPublishGradlePlugin.groovy    |   6 +-
 grails-gsp/core/build.gradle                       |   1 +
 grails-gsp/grails-sitemesh3/build.gradle           |   1 +
 grails-gsp/grails-taglib/build.gradle              |   1 +
 grails-gsp/grails-web-gsp-taglib/build.gradle      |   1 +
 grails-gsp/grails-web-gsp/build.gradle             |   1 +
 grails-gsp/grails-web-jsp/build.gradle             |   1 +
 grails-gsp/grails-web-taglib/build.gradle          |   1 +
 grails-gsp/plugin/build.gradle                     |   1 +
 grails-i18n/build.gradle                           |   1 +
 grails-interceptors/build.gradle                   |   1 +
 grails-logging/build.gradle                        |   1 +
 grails-mimetypes/build.gradle                      |   1 +
 grails-profiles/base/build.gradle                  |   1 +
 grails-profiles/plugin/build.gradle                |   1 +
 grails-profiles/profile/build.gradle               |   1 +
 grails-profiles/rest-api-plugin/build.gradle       |   1 +
 grails-profiles/rest-api/build.gradle              |   1 +
 grails-profiles/web-plugin/build.gradle            |   1 +
 grails-profiles/web/build.gradle                   |   1 +
 grails-rest-transforms/build.gradle                |   1 +
 grails-services/build.gradle                       |   1 +
 grails-shell-cli/build.gradle                      |   1 +
 grails-spring/build.gradle                         |   1 +
 grails-test-core/build.gradle                      |   1 +
 grails-test-examples/cache/build.gradle            |   1 +
 .../hibernate5/spring-boot-hibernate/build.gradle  |   1 +
 .../hibernate5/standalone-hibernate/build.gradle   |   1 +
 .../views-functional-tests-plugin/build.gradle     |   1 +
 .../views-functional-tests/build.gradle            |   1 +
 grails-test-suite-persistence/build.gradle         |  60 +++++--
 grails-test-suite-uber/build.gradle                |   1 +
 grails-testing-support-core/build.gradle           |   1 +
 grails-testing-support-datamapping/build.gradle    |   1 +
 grails-testing-support-mongodb/build.gradle        |   1 +
 grails-testing-support-views-gson/build.gradle     |   1 +
 grails-testing-support-web/build.gradle            |   1 +
 grails-url-mappings/build.gradle                   |   1 +
 grails-validation/build.gradle                     |   1 +
 grails-views-core/build.gradle                     |   1 +
 grails-views-gson/build.gradle                     |   1 +
 grails-views-markup/build.gradle                   |   1 +
 grails-web-boot/build.gradle                       |   1 +
 grails-web-common/build.gradle                     |   1 +
 grails-web-core/build.gradle                       |   1 +
 grails-web-databinding/build.gradle                |   1 +
 grails-web-mvc/build.gradle                        |   1 +
 grails-web-url-mappings/build.gradle               |   1 +
 113 files changed, 657 insertions(+), 136 deletions(-)

diff --git a/.gitignore b/.gitignore
index 4a647cf953..1f86a9c757 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,4 +53,5 @@ target
 tmp/
 !grails-fields/src/main/groovy/org/grails/scaffolding/registry/output
 !etc/bin
+!buildSrc/src/main/groovy/org/apache/grails/internal/build
 etc/bin/results
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1595ba9a3a..5c1c0583a4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -229,9 +229,9 @@ Essentially, using the `toc.yml` file and the directory 
structure you can manipu
 
 To generate the documentation run the `publishGuide` in the `grails-doc` task:
 
-    ./gradlew :grails-doc:publishGuide -x aggregateGroovydoc
+    ./gradlew :grails-doc:publishGuide -x grailsGroovydoc
 
-NOTE: In the above example we skip the `aggregateGroovydoc` task to speed up 
building of the guide, otherwise all
+NOTE: In the above example we skip the `grailsGroovydoc` task to speed up 
building of the guide, otherwise all
 Groovydoc documentation will be built too!
 
 Once the guide is built simply open the 
`grails-doc/build/original-guide/index.html` file in a browser to review your
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index ad956ef33e..6e57259e19 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -50,4 +50,6 @@ dependencies {
     implementation 'org.asciidoctor:asciidoctor-gradle-jvm'
     implementation 'org.springframework.boot:spring-boot-gradle-plugin'
     implementation 
'org.nosphere.apache.rat:org.nosphere.apache.rat.gradle.plugin:0.8.1'
+
+    compileOnly 'org.apache.groovy:groovy-groovydoc:4.0.27-SNAPSHOT'
 }
\ No newline at end of file
diff --git 
a/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydoc.groovy
 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydoc.groovy
new file mode 100644
index 0000000000..0c897c0e80
--- /dev/null
+++ 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydoc.groovy
@@ -0,0 +1,184 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.grails.internal.build
+
+import org.gradle.api.DefaultTask
+import org.gradle.api.InvalidUserDataException
+import org.gradle.api.UncheckedIOException
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.file.FileSystemOperations
+import org.gradle.api.internal.tasks.GroovydocAntAction
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.provider.Property
+import org.gradle.api.resources.TextResource
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.JavaExec
+import org.gradle.api.tasks.Nested
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.api.tasks.javadoc.GroovydocAccess
+import org.gradle.internal.enterprise.test.FileProperty
+import org.gradle.process.JavaForkOptions
+import org.gradle.workers.WorkerExecutor
+
+import javax.inject.Inject
+
+/**
+ * Uses process isolation to reduce memory footprint in Groovydoc
+ */
+@CacheableTask
+abstract class GrailsGroovydoc extends DefaultTask {
+    @Input
+    final Property<String> author
+
+    @Input
+    final Property<String> charset
+
+    @Input
+    final Property<Boolean> debugOutput
+
+    @Input
+    final Property<String> docTitle
+
+    @Input
+    final Property<String> fileEncoding
+
+    @Input
+    final Property<String> footer
+
+    @Input
+    final Property<String> header
+
+    @Input
+    final Property<Boolean> noMainForScripts
+
+    @Input
+    final Property<Boolean> noScripts
+
+    @Input
+    final Property<Boolean> noTimestamp
+
+    @Input
+    final Property<Boolean> noVersionTimestamp
+
+    @Input
+    final Property<GroovydocAccess> access
+
+    @Nested
+    JavaForkOptions forkOptions
+
+    @InputFile
+    @PathSensitive(PathSensitivity.RELATIVE)
+    final FileProperty overview
+
+    @InputFiles
+    @PathSensitive(PathSensitivity.RELATIVE)
+    final ConfigurableFileCollection groovyClasspath // where to locate the 
groovydoc library
+
+    @InputFiles
+    @PathSensitive(PathSensitivity.RELATIVE)
+    final ConfigurableFileCollection source // files to generate groovydoc for
+
+    @OutputDirectory
+    final DirectoryProperty destinationDirectory
+
+    private final ObjectFactory objects
+    private final WorkerExecutor workerExecutor
+
+    @Inject
+    GrailsGroovydoc(ObjectFactory objects, WorkerExecutor workerExecutor) {
+        this.objects = objects
+        this.workerExecutor = workerExecutor
+
+        author = objects.property(String)
+        charset = objects.property(String)
+        debugOutput = objects.property(Boolean)
+        docTitle = objects.property(String)
+        fileEncoding = objects.property(String)
+        footer = objects.property(String)
+        header = objects.property(String)
+        noMainForScripts = objects.property(Boolean)
+        noScripts = objects.property(Boolean)
+        noTimestamp = objects.property(Boolean)
+        noVersionTimestamp = objects.property(Boolean)
+        access = objects.property(GroovydocAccess)
+        groovyClasspath = objects.fileCollection()
+        source = objects.fileCollection()
+        destinationDirectory = objects.directoryProperty()
+        forkOptions = objects.newInstance(JavaForkOptions)
+    }
+
+    @TaskAction
+    protected void generate() {
+        if (this.getGroovyClasspath().getFiles().isEmpty()) {
+            throw new InvalidUserDataException("You must assign a Groovy 
library to the groovy configuration!")
+        }
+
+        workerExecutor.processIsolation {
+             it.forkOptions.jvmArgs = forkOptions.jvmArgs
+             it.forkOptions.debug = forkOptions.debug
+             it.forkOptions.executable = forkOptions.executable
+        }.submit(GrailsGroovydocWorker) {
+            params()
+        }
+
+
+        File destinationDir = this.getDestinationDir()
+
+        try {
+            this.getDeleter().ensureEmptyDirectory(destinationDir)
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex)
+        }
+
+        FileSystemOperations fsOperations = (FileSystemOperations) 
this.getServices().get(FileSystemOperations.class)
+        File tmpDir = this.getTemporaryDir()
+        fsOperations.delete((spec) -> spec.delete(new Object[]{tmpDir}))
+        fsOperations.copy((spec) -> spec.from(new 
Object[]{this.getSource()}).into(tmpDir))
+
+        List cp = getClasspath().collect { it } + getGroovyClasspath().collect 
{ it }
+        
this.getWorkerExecutor().classLoaderIsolation().submit(GroovydocAntAction.class,
 (parameters) -> {
+            parameters.getAntLibraryClasspath().from(new Object[]{cp})
+            parameters.getSource().convention(this.getSource())
+            parameters.getDestinationDirectory().fileValue(destinationDir)
+            parameters.getUse().convention(this.isUse())
+            parameters.getNoTimestamp().convention(this.isNoTimestamp())
+            parameters.getNoVersionStamp().convention(this.isNoVersionStamp())
+            parameters.getWindowTitle().convention(this.getWindowTitle())
+            parameters.getDocTitle().convention(this.getDocTitle())
+            parameters.getHeader().convention(this.getHeader())
+            parameters.getFooter().convention(this.getFooter())
+            TextResource overview = this.getOverviewText()
+            parameters.getOverview().convention(overview != null ? 
overview.asFile().getAbsolutePath() : null)
+            parameters.getAccess().convention(this.getAccess())
+            parameters.getLinks().convention(this.getLinks())
+            parameters.getTmpDir().fileValue(this.getTemporaryDir())
+            parameters.getIncludeAuthor().convention(this.getIncludeAuthor())
+            parameters.getProcessScripts().convention(this.getProcessScripts())
+            
parameters.getIncludeMainForScripts().convention(this.getIncludeMainForScripts())
+        })
+    }
+}
diff --git 
a/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocParameters.groovy
 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocParameters.groovy
new file mode 100644
index 0000000000..b1a3e82b13
--- /dev/null
+++ 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocParameters.groovy
@@ -0,0 +1,52 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.grails.internal.build
+
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.SetProperty
+import org.gradle.api.tasks.javadoc.Groovydoc
+import org.gradle.api.tasks.javadoc.GroovydocAccess
+import org.gradle.internal.enterprise.test.FileProperty
+import org.gradle.workers.WorkParameters
+
+interface GrailsGroovydocParameters extends WorkParameters {
+    Property<String> getIncludeAuthor()
+    Property<String> getCharset()
+    Property<String> getDocTitle()
+    Property<String> getWindowTitle()
+    Property<String> getFileEncoding()
+    Property<String> getFooter()
+    Property<String> getHeader()
+    Property<Boolean> getNoMainForScripts()
+    Property<Boolean> getIncludeScripts()
+    Property<Boolean> getNoTimestamp()
+    Property<Boolean> getNoVersionTimestamp()
+    Property<String> getJavaVersion()
+    Property<GroovydocAccess> getAccess()
+    FileProperty getOverview()
+    ConfigurableFileCollection getSource()
+    DirectoryProperty getDestinationDirectory()
+    Property<Boolean> getIncludeUsagePages() // use flag
+    SetProperty<Groovydoc.Link> getLinks();
+    RegularFileProperty getTmpDir();
+}
diff --git 
a/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocPlugin.groovy
 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocPlugin.groovy
new file mode 100644
index 0000000000..c1f18f2e7b
--- /dev/null
+++ 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocPlugin.groovy
@@ -0,0 +1,132 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.grails.internal.build
+
+import groovy.transform.CompileDynamic
+import groovy.transform.CompileStatic
+import org.gradle.api.NamedDomainObjectProvider
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.Configuration
+import org.gradle.api.attributes.Bundling
+import org.gradle.api.attributes.Category
+import org.gradle.api.attributes.Usage
+import org.gradle.api.file.SourceDirectorySet
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.plugins.internal.JavaPluginHelper
+import org.gradle.api.plugins.jvm.internal.JvmFeatureInternal
+import org.gradle.api.tasks.GroovySourceDirectorySet
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.api.tasks.javadoc.GroovydocAccess
+
+import javax.inject.Inject
+
+@CompileStatic
+abstract class GrailsGroovydocPlugin implements Plugin<Project> {
+
+    private ObjectFactory objects
+
+    @Inject
+    GrailsGroovydocPlugin(ObjectFactory objects) {
+        this.objects = objects
+    }
+
+    @CompileDynamic
+    String resolveProjectVersion(String artifact, Project project) {
+        String version = project.configurations.runtimeClasspath
+                .resolvedConfiguration
+                .resolvedArtifacts
+                .find {
+                    it.moduleVersion.id.name == artifact
+                }?.moduleVersion?.id?.version
+        if (!version) {
+            return null
+        }
+    }
+
+    @Override
+    void apply(Project project) {
+        NamedDomainObjectProvider<Configuration> documentation = 
project.configurations.register('documentation') { Configuration doc ->
+            doc.canBeConsumed = false
+            doc.canBeResolved = true
+            doc.attributes {
+                it.attribute(Category.CATEGORY_ATTRIBUTE, 
objects.named(Category, Category.LIBRARY))
+                it.attribute(Bundling.BUNDLING_ATTRIBUTE, 
objects.named(Bundling, Bundling.EXTERNAL))
+                it.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, 
Usage.JAVA_RUNTIME))
+            }
+        }
+
+        project.dependencies.add('documentation', 
project.dependencies.platform(project.rootProject.project(':grails-bom')))
+        project.dependencies.add('documentation', 'org.fusesource.jansi:jansi')
+        project.dependencies.add('documentation', 'jline:jline')
+        project.dependencies.add('documentation', 
'com.github.javaparser:javaparser-core')
+        project.dependencies.add('documentation', 'org.apache.groovy:groovy')
+        project.dependencies.add('documentation', 
'org.apache.groovy:groovy-groovydoc')
+        project.dependencies.add('documentation', 
'org.apache.groovy:groovy-ant')
+        project.dependencies.add('documentation', 
'org.apache.groovy:groovy-docgenerator')
+        project.dependencies.add('documentation', 
'org.apache.groovy:groovy-templates')
+
+        TaskProvider<GrailsGroovydoc> grailsGroovydoc = 
project.tasks.register('grailsGroovydoc', GrailsGroovydoc)
+//        grailsGroovydoc.configure { GrailsGroovydoc gdoc ->
+//            gdoc.exclude('META-INF/**', '*yml', '*properties', '*xml', 
'**/Application.groovy', '**/Bootstrap.groovy', '**/resources.groovy')
+//            gdoc.description = 'Generate Groovydoc API documentation for the 
main source code in an isolated process.'
+//            gdoc.group = 'documentation'
+//
+//            JvmFeatureInternal mainFeature = 
JavaPluginHelper.getJavaComponent(project).mainFeature
+//            gdoc.classpath = 
mainFeature.sourceSet.output.plus(mainFeature.sourceSet.compileClasspath)
+//            gdoc.source = (SourceDirectorySet) 
mainFeature.sourceSet.extensions.getByType(GroovySourceDirectorySet)
+//
+//            gdoc.groovyClasspath = project.files(documentation)
+//            gdoc.windowTitle = "${project.findProperty('pomArtifactId') ?: 
project.name} - ${project.findProperty('projectVersion')}"
+//            gdoc.docTitle = "${project.findProperty('pomArtifactId') ?: 
project.name} - ${project.findProperty('projectVersion')}"
+//            gdoc.access.set(GroovydocAccess.PROTECTED)
+//            gdoc.includeAuthor.set(true)
+//            gdoc.includeMainForScripts.set(false)
+//            gdoc.processScripts.set(false)
+//            gdoc.noTimestamp = true
+//
+//            gdoc.doFirst {
+//                def gebVersion = resolveProjectVersion('geb-spock', project)
+//                if(gebVersion) {
+//                    
gdoc.link("https://www.gebish.org/manual/${gebVersion}/api/";, 'geb.')
+//                }
+//
+//                def testContainersVersion = 
resolveProjectVersion('testcontainers', project)
+//                if(testContainersVersion) {
+//                    
gdoc.link("https://javadoc.io/doc/org.testcontainers/testcontainers/${testContainersVersion}/";,
 'org.testcontainers.')
+//                }
+//
+//                def springVersion = resolveProjectVersion('spring-core', 
project)
+//                if(springVersion) {
+//                    
gdoc.link("https://docs.spring.io/spring-framework/docs/${springVersion}/javadoc-api/";,
 'org.springframework.core.')
+//                }
+//
+//                def springBootVersion = resolveProjectVersion('spring-boot', 
project)
+//                if(springBootVersion) {
+//                    
gdoc.link("https://docs.spring.io/spring-boot/docs/${springBootVersion}/api/";, 
'org.springframework.boot.')
+//                }
+//            }
+//        }
+
+        project.tasks.named('groovydoc').configure {groovydoc ->
+            groovydoc.enabled = false
+        }
+    }
+}
diff --git 
a/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocWorker.groovy
 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocWorker.groovy
new file mode 100644
index 0000000000..8496006f17
--- /dev/null
+++ 
b/buildSrc/src/main/groovy/org/apache/grails/internal/build/GrailsGroovydocWorker.groovy
@@ -0,0 +1,81 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.grails.internal.build
+
+import org.apache.groovy.util.SystemUtil
+import org.codehaus.groovy.tools.groovydoc.ClasspathResourceManager
+import org.codehaus.groovy.tools.groovydoc.GroovyDocTool
+import org.codehaus.groovy.tools.groovydoc.LinkArgument
+import 
org.codehaus.groovy.tools.groovydoc.gstringTemplates.GroovyDocTemplateInfo
+import org.gradle.api.tasks.javadoc.Groovydoc
+import org.gradle.workers.WorkAction
+
+abstract class GrailsGroovydocWorker implements 
WorkAction<GrailsGroovydocParameters> {
+    @Override
+    void execute() {
+        GrailsGroovydocParameters parameters = getParameters()
+
+        List<String> sourcePaths = parameters.source.getFiles().collect{ 
it.absolutePath }
+
+        List<String> packagesToDoc = new ArrayList<>();
+        Properties properties = new Properties();
+        properties.setProperty("windowTitle", windowTitle);
+        properties.setProperty("docTitle", docTitle);
+        properties.setProperty("footer", footer);
+        properties.setProperty("header", header);
+        checkScopeProperties(properties);
+        properties.setProperty("publicScope", publicScope.toString());
+        properties.setProperty("protectedScope", protectedScope.toString());
+        properties.setProperty("packageScope", packageScope.toString());
+        properties.setProperty("privateScope", privateScope.toString());
+        properties.setProperty("author", author.toString());
+        properties.setProperty("processScripts", processScripts.toString());
+        properties.setProperty("includeMainForScripts", 
includeMainForScripts.toString());
+        properties.setProperty("overviewFile", overviewFile != null ? 
overviewFile.getAbsolutePath() : "");
+        properties.setProperty("charset", charset != null ? charset : "");
+        properties.setProperty("fileEncoding", fileEncoding != null ? 
fileEncoding : "");
+        properties.setProperty("timestamp", 
Boolean.valueOf(!noTimestamp).toString());
+        properties.setProperty("versionStamp", 
Boolean.valueOf(!noVersionStamp).toString());
+        String phaseOverride = 
SystemUtil.getSystemPropertySafe("groovydoc.phase.override");
+        if (phaseOverride != null) properties.put("phaseOverride", 
phaseOverride);
+
+        if (sourcePath != null) {
+            sourceDirs.addExisting(sourcePath);
+        }
+
+        def links = parameters.links.get().collect{ link ->
+            LinkArgument arg = new LinkArgument()
+            arg.setHref(link.url)
+            arg.setPackages(link.packages.join(","))
+            arg
+        }
+
+        GroovyDocTool htmlTool = new GroovyDocTool(
+                new ClasspathResourceManager(), // we're gonna get the default 
templates out of the dist jar file
+                sourcePaths as String[],
+                GroovyDocTemplateInfo.DEFAULT_DOC_TEMPLATES,
+                GroovyDocTemplateInfo.DEFAULT_PACKAGE_TEMPLATES,
+                GroovyDocTemplateInfo.DEFAULT_CLASS_TEMPLATES,
+                links,
+                parameters.javaVersion.getOrNull(),
+                properties
+        );
+    }
+}
diff --git 
a/buildSrc/src/main/resources/META-INF/gradle-plugins/grails.groovydoc.properties
 
b/buildSrc/src/main/resources/META-INF/gradle-plugins/grails.groovydoc.properties
new file mode 100644
index 0000000000..82369d246e
--- /dev/null
+++ 
b/buildSrc/src/main/resources/META-INF/gradle-plugins/grails.groovydoc.properties
@@ -0,0 +1,20 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#
+
+implementation-class=org.apache.grails.internal.build.GrailsGroovydocPlugin
\ No newline at end of file
diff --git a/gradle/docs-config.gradle b/gradle/docs-config.gradle
index 5b5c7d1794..d4e1336a7c 100644
--- a/gradle/docs-config.gradle
+++ b/gradle/docs-config.gradle
@@ -17,8 +17,6 @@
  *  under the License.
  */
 
-apply from: 
rootProject.layout.projectDirectory.file('gradle/docs-dependencies.gradle')
-
 ext {
     includeInApiDocs = true
 }
\ No newline at end of file
diff --git a/gradle/docs-dependencies.gradle b/gradle/docs-dependencies.gradle
deleted file mode 100644
index df7d1e8de4..0000000000
--- a/gradle/docs-dependencies.gradle
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-configurations.register('documentation') {
-    canBeConsumed = false
-    canBeResolved = true
-    attributes {
-        attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, 
Category.LIBRARY))
-        attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, 
Bundling.EXTERNAL))
-        attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, 
Usage.JAVA_RUNTIME))
-    }
-}
-
-dependencies {
-    add('documentation', platform(project(':grails-bom')))
-    add('documentation', 'org.fusesource.jansi:jansi')
-    add('documentation', 'jline:jline')
-    add('documentation', 'com.github.javaparser:javaparser-core')
-    add('documentation', 'org.apache.groovy:groovy')
-    add('documentation', 'org.apache.groovy:groovy-groovydoc')
-    add('documentation', 'org.apache.groovy:groovy-ant')
-    add('documentation', 'org.apache.groovy:groovy-docgenerator')
-    add('documentation', 'org.apache.groovy:groovy-templates')
-}
-
-String resolveProjectVersion(String artifact) {
-    String version = configurations.runtimeClasspath
-            .resolvedConfiguration
-            .resolvedArtifacts
-            .find {
-                it.moduleVersion.id.name == artifact
-            }?.moduleVersion?.id?.version
-    if (!version) {
-        return null
-    }
-}
-
-tasks.withType(Groovydoc).configureEach { Groovydoc gdoc ->
-    gdoc.exclude('META-INF/**', '*yml', '*properties', '*xml', 
'**/Application.groovy', '**/Bootstrap.groovy', '**/resources.groovy')
-    gdoc.groovyClasspath = configurations.documentation
-    gdoc.windowTitle = "${project.findProperty('pomArtifactId') ?: 
project.name} - $projectVersion"
-    gdoc.docTitle = "${project.findProperty('pomArtifactId') ?: project.name} 
- $projectVersion"
-    gdoc.access = GroovydocAccess.PROTECTED
-    gdoc.includeAuthor = true
-    gdoc.includeMainForScripts = false
-    gdoc.processScripts = false
-    gdoc.noTimestamp = true
-
-    doFirst {
-        def gebVersion = resolveProjectVersion('geb-spock')
-        if(gebVersion) {
-            gdoc.link("https://www.gebish.org/manual/${gebVersion}/api/";, 
'geb.')
-        }
-
-        def testContainersVersion = resolveProjectVersion('testcontainers')
-        if(testContainersVersion) {
-            
gdoc.link("https://javadoc.io/doc/org.testcontainers/testcontainers/${testContainersVersion}/";,
 'org.testcontainers.')
-        }
-
-        def springVersion = resolveProjectVersion('spring-core')
-        if(springVersion) {
-            
gdoc.link("https://docs.spring.io/spring-framework/docs/${springVersion}/javadoc-api/";,
 'org.springframework.core.')
-        }
-
-        def springBootVersion = resolveProjectVersion('spring-boot')
-        if(springBootVersion) {
-            
gdoc.link("https://docs.spring.io/spring-boot/docs/${springBootVersion}/api/";, 
'org.springframework.boot.')
-        }
-    }
-}
\ No newline at end of file
diff --git a/grails-async/core/build.gradle b/grails-async/core/build.gradle
index 6a4f2b9679..dc280a2ac4 100644
--- a/grails-async/core/build.gradle
+++ b/grails-async/core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-async/gpars/build.gradle b/grails-async/gpars/build.gradle
index ab599f3da3..29b6837bd6 100644
--- a/grails-async/gpars/build.gradle
+++ b/grails-async/gpars/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-async/plugin/build.gradle b/grails-async/plugin/build.gradle
index f8ff94c033..f07dacd47a 100644
--- a/grails-async/plugin/build.gradle
+++ b/grails-async/plugin/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-async/rxjava/build.gradle b/grails-async/rxjava/build.gradle
index b15111a395..107fbfb77e 100644
--- a/grails-async/rxjava/build.gradle
+++ b/grails-async/rxjava/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-async/rxjava2/build.gradle 
b/grails-async/rxjava2/build.gradle
index 41732df8d9..32558edd8e 100644
--- a/grails-async/rxjava2/build.gradle
+++ b/grails-async/rxjava2/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-async/rxjava3/build.gradle 
b/grails-async/rxjava3/build.gradle
index 3c62cff0dd..7f0e2e9db9 100644
--- a/grails-async/rxjava3/build.gradle
+++ b/grails-async/rxjava3/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-bootstrap/build.gradle b/grails-bootstrap/build.gradle
index b42df191c8..452b5a0966 100644
--- a/grails-bootstrap/build.gradle
+++ b/grails-bootstrap/build.gradle
@@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-cache/build.gradle b/grails-cache/build.gradle
index 2575e34f18..8eb1465457 100644
--- a/grails-cache/build.gradle
+++ b/grails-cache/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-codecs-core/build.gradle b/grails-codecs-core/build.gradle
index 4fa52b2bb4..187c2e1fa1 100644
--- a/grails-codecs-core/build.gradle
+++ b/grails-codecs-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-codecs/build.gradle b/grails-codecs/build.gradle
index e0468e90ae..2bd27eb498 100644
--- a/grails-codecs/build.gradle
+++ b/grails-codecs/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-common/build.gradle b/grails-common/build.gradle
index 3dadf85c54..55ebc5d6e8 100644
--- a/grails-common/build.gradle
+++ b/grails-common/build.gradle
@@ -17,6 +17,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-console/build.gradle b/grails-console/build.gradle
index e2d0cc792d..b94d930673 100644
--- a/grails-console/build.gradle
+++ b/grails-console/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-controllers/build.gradle b/grails-controllers/build.gradle
index 457a8f9748..c4106b496e 100644
--- a/grails-controllers/build.gradle
+++ b/grails-controllers/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-converters/build.gradle b/grails-converters/build.gradle
index c9a0d65d31..d6987285e8 100644
--- a/grails-converters/build.gradle
+++ b/grails-converters/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-core/build.gradle b/grails-core/build.gradle
index e1d525c179..c541239cfb 100644
--- a/grails-core/build.gradle
+++ b/grails-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-data-docs/stage/build.gradle 
b/grails-data-docs/stage/build.gradle
index e9c7f7354b..f56f71cbd6 100644
--- a/grails-data-docs/stage/build.gradle
+++ b/grails-data-docs/stage/build.gradle
@@ -1,3 +1,5 @@
+import org.apache.grails.internal.build.GrailsGroovydoc
+
 /*
  *  Licensed to the Apache Software Foundation (ASF) under one
  *  or more contributor license agreements.  See the NOTICE file
@@ -17,12 +19,14 @@
  *  under the License.
  */
 
-apply plugin: 'groovy'
+plugins {
+    id 'groovy'
+    id 'grails.groovydoc'
+}
 
 // grails-data-mapping api
-def combinedGroovydoc = tasks.register('aggregateDataMappingGroovydoc', 
Groovydoc)
-apply from: 
rootProject.layout.projectDirectory.file('gradle/docs-dependencies.gradle')
-combinedGroovydoc.configure { Groovydoc task ->
+def combinedGroovydoc = tasks.named('grailsGroovydoc', GrailsGroovydoc)
+combinedGroovydoc.configure { GrailsGroovydoc task ->
     task.windowTitle = "Grails Data Mapping API - ${projectVersion}"
     task.docTitle = "Grails Data Mapping API - ${projectVersion}"
 
@@ -102,7 +106,7 @@ tasks.register('copyHibernate5Docs', Sync).configure { Sync 
it ->
 
 tasks.register('docs', Sync).configure { Sync it ->
     it.group = 'documentation'
-    it.dependsOn('aggregateDataMappingGroovydoc', 'copyGuides', 
'copyMongodbDocs', 'copyHibernate5Docs')
+    it.dependsOn('grailsGroovydoc', 'copyGuides', 'copyMongodbDocs', 
'copyHibernate5Docs')
 
     def websiteDir = 
rootProject.layout.projectDirectory.dir('grails-data-docs/data-mapping-website/src/main/resources')
     def guidesDir = project.layout.buildDirectory.dir('guides/grails-data')
diff --git a/grails-data-hibernate5/boot-plugin/build.gradle 
b/grails-data-hibernate5/boot-plugin/build.gradle
index 5a054dca25..4b0fd8a9f2 100644
--- a/grails-data-hibernate5/boot-plugin/build.gradle
+++ b/grails-data-hibernate5/boot-plugin/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-data-hibernate5/core/build.gradle 
b/grails-data-hibernate5/core/build.gradle
index 33fb9277d4..c8d9bf38e4 100644
--- a/grails-data-hibernate5/core/build.gradle
+++ b/grails-data-hibernate5/core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-data-hibernate5/docs/build.gradle 
b/grails-data-hibernate5/docs/build.gradle
index 77823b598d..f38d41a464 100644
--- a/grails-data-hibernate5/docs/build.gradle
+++ b/grails-data-hibernate5/docs/build.gradle
@@ -17,10 +17,13 @@
  *  under the License.
  */
 
+
+import org.apache.grails.internal.build.GrailsGroovydoc
 import org.asciidoctor.gradle.jvm.AsciidoctorTask
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.asciidoctor.jvm.convert'
 }
 
@@ -91,7 +94,7 @@ tasks.named('asciidoctor', AsciidoctorTask) { AsciidoctorTask 
it ->
     ]
 }
 
-tasks.withType(Groovydoc).configureEach {
+tasks.withType(GrailsGroovydoc).configureEach {
     it.dependsOn(rootProject.subprojects
             .findAll { it.findProperty('gormApiDocs') }
             .collect { ":${it.name}:groovydoc" })
diff --git a/grails-data-mongodb/boot-plugin/build.gradle 
b/grails-data-mongodb/boot-plugin/build.gradle
index 11b97e45c4..36664167ba 100644
--- a/grails-data-mongodb/boot-plugin/build.gradle
+++ b/grails-data-mongodb/boot-plugin/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-data-mongodb/bson/build.gradle 
b/grails-data-mongodb/bson/build.gradle
index 646d1fe318..fe86803caf 100644
--- a/grails-data-mongodb/bson/build.gradle
+++ b/grails-data-mongodb/bson/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-data-mongodb/core/build.gradle 
b/grails-data-mongodb/core/build.gradle
index f7ac7978c8..c1bd413827 100644
--- a/grails-data-mongodb/core/build.gradle
+++ b/grails-data-mongodb/core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-data-mongodb/docs/build.gradle 
b/grails-data-mongodb/docs/build.gradle
index 0db93bfa7a..5413a9e858 100644
--- a/grails-data-mongodb/docs/build.gradle
+++ b/grails-data-mongodb/docs/build.gradle
@@ -17,10 +17,13 @@
  *  under the License.
  */
 
+
+import org.apache.grails.internal.build.GrailsGroovydoc
 import org.asciidoctor.gradle.jvm.AsciidoctorTask
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.asciidoctor.jvm.convert'
 }
 
@@ -98,7 +101,7 @@ tasks.named('asciidoctor', AsciidoctorTask) { 
AsciidoctorTask it ->
     ]
 }
 
-tasks.withType(Groovydoc).configureEach { Groovydoc groovydoc ->
+tasks.withType(GrailsGroovydoc).configureEach { GrailsGroovydoc groovydoc ->
     groovydoc.dependsOn(rootProject.subprojects
             .findAll { it.findProperty('gormApiDocs') }
             .collect { ":${it.name}:groovydoc" })
diff --git a/grails-data-mongodb/ext/build.gradle 
b/grails-data-mongodb/ext/build.gradle
index 86bcaa1539..c0d32ef0bb 100644
--- a/grails-data-mongodb/ext/build.gradle
+++ b/grails-data-mongodb/ext/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-data-mongodb/grails-plugin/build.gradle 
b/grails-data-mongodb/grails-plugin/build.gradle
index db68de1d36..0b7fa2a315 100644
--- a/grails-data-mongodb/grails-plugin/build.gradle
+++ b/grails-data-mongodb/grails-plugin/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'java-test-fixtures'
 }
diff --git a/grails-data-mongodb/gson-templates/build.gradle 
b/grails-data-mongodb/gson-templates/build.gradle
index f276cd8ca4..9dff1c4e23 100644
--- a/grails-data-mongodb/gson-templates/build.gradle
+++ b/grails-data-mongodb/gson-templates/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-data-simple/build.gradle b/grails-data-simple/build.gradle
index a603bcff0f..a64c6a0e94 100644
--- a/grails-data-simple/build.gradle
+++ b/grails-data-simple/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-databinding-core/build.gradle 
b/grails-databinding-core/build.gradle
index 4efb0bfcfb..d018ee8355 100644
--- a/grails-databinding-core/build.gradle
+++ b/grails-databinding-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-databinding/build.gradle b/grails-databinding/build.gradle
index 410535c324..730021cc1c 100644
--- a/grails-databinding/build.gradle
+++ b/grails-databinding/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-datamapping-async/build.gradle 
b/grails-datamapping-async/build.gradle
index 81458a5169..76510f9418 100644
--- a/grails-datamapping-async/build.gradle
+++ b/grails-datamapping-async/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datamapping-core-test/build.gradle 
b/grails-datamapping-core-test/build.gradle
index e55f775f23..9b66a1db80 100644
--- a/grails-datamapping-core-test/build.gradle
+++ b/grails-datamapping-core-test/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datamapping-core/build.gradle 
b/grails-datamapping-core/build.gradle
index 52ef07e4b8..b2555d3dd7 100644
--- a/grails-datamapping-core/build.gradle
+++ b/grails-datamapping-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datamapping-rx/build.gradle 
b/grails-datamapping-rx/build.gradle
index 12ec2fef9f..77d91d816d 100644
--- a/grails-datamapping-rx/build.gradle
+++ b/grails-datamapping-rx/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datamapping-support/build.gradle 
b/grails-datamapping-support/build.gradle
index 01c740d8a2..e51982dfd0 100644
--- a/grails-datamapping-support/build.gradle
+++ b/grails-datamapping-support/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datamapping-tck/build.gradle 
b/grails-datamapping-tck/build.gradle
index e89fc3067d..5983db9d69 100644
--- a/grails-datamapping-tck/build.gradle
+++ b/grails-datamapping-tck/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datamapping-validation/build.gradle 
b/grails-datamapping-validation/build.gradle
index 544cf7dc74..0269397918 100644
--- a/grails-datamapping-validation/build.gradle
+++ b/grails-datamapping-validation/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datasource/build.gradle b/grails-datasource/build.gradle
index c5fb199e6a..ee0c99f6a2 100644
--- a/grails-datasource/build.gradle
+++ b/grails-datasource/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-datastore-async/build.gradle 
b/grails-datastore-async/build.gradle
index 1b1838e4ae..8d4b1daa74 100644
--- a/grails-datastore-async/build.gradle
+++ b/grails-datastore-async/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datastore-core/build.gradle 
b/grails-datastore-core/build.gradle
index 7a70a7915e..840ebea370 100644
--- a/grails-datastore-core/build.gradle
+++ b/grails-datastore-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-datastore-web/build.gradle 
b/grails-datastore-web/build.gradle
index a177a1fb38..b5eab5e756 100644
--- a/grails-datastore-web/build.gradle
+++ b/grails-datastore-web/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-doc/build.gradle b/grails-doc/build.gradle
index 4272265841..82f88e074b 100644
--- a/grails-doc/build.gradle
+++ b/grails-doc/build.gradle
@@ -19,11 +19,13 @@
 
 import grails.doc.AddReleaseDropDown
 import grails.doc.gradle.PublishGuide
+import org.apache.grails.internal.build.GrailsGroovydoc
 
 plugins {
     id 'base'
     id 'org.asciidoctor.jvm.convert'
     id 'groovy'
+    id 'grails.groovydoc'
 }
 
 compileJava.options.release = javaVersion.toInteger()
@@ -56,9 +58,8 @@ dependencies {
 }
 
 // this task needs to be here instead of the root since bom resolution only 
occurs when the java / groovy plugins are applied
-def combinedGroovydoc = tasks.register('aggregateGroovydoc', Groovydoc)
-apply from: 
rootProject.layout.projectDirectory.file('gradle/docs-dependencies.gradle')
-combinedGroovydoc.configure { Groovydoc gdoc ->
+def combinedGroovydoc = tasks.named('grailsGroovydoc', GrailsGroovydoc)
+combinedGroovydoc.configure { GrailsGroovydoc gdoc ->
     gdoc.windowTitle = "Grails $projectVersion"
     gdoc.docTitle = "Grails $projectVersion"
 
@@ -117,7 +118,7 @@ asciidoctor {
             'sourcedir': rootProject.projectDir.absolutePath
 }
 
-asciidoctor.dependsOn('aggregateGroovydoc')
+asciidoctor.dependsOn('grailsGroovydoc')
 
 tasks.register('dist', Zip).configure { Zip it ->
     it.dependsOn 'docs'
@@ -160,7 +161,7 @@ String getVersion(String artifact) {
 }
 
 tasks.register('publishGuide', PublishGuide).configure { PublishGuide publish 
->
-    publish.dependsOn(['generateBomDocumentation', 'aggregateGroovydoc', 
'jar', 'resolveGroovyVersion', 'processTestResources', 'compileTestJava', 
'compileTestGroovy', 'test'])
+    publish.dependsOn(['generateBomDocumentation', 'grailsGroovydoc', 'jar', 
'resolveGroovyVersion', 'processTestResources', 'compileTestJava', 
'compileTestGroovy', 'test'])
 
     // No language setting because we want the English guide to be
     // generated with a 'en' in the path, but the source is in 'en'
@@ -250,7 +251,7 @@ tasks.register('generateGuide').configure { Task task ->
 }
 
 tasks.register('docs', Sync).configure { Sync it ->
-    it.dependsOn 'aggregateGroovydoc', 'generateGuide', 
':grails-data-docs-stage:docs'
+    it.dependsOn 'grailsGroovydoc', 'generateGuide', 
':grails-data-docs-stage:docs'
     it.group = 'documentation'
 
     def manualDocsDir = project.layout.buildDirectory.dir('modified-guide')
diff --git a/grails-domain-class/build.gradle b/grails-domain-class/build.gradle
index c53f0d33dd..1f72567478 100644
--- a/grails-domain-class/build.gradle
+++ b/grails-domain-class/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-encoder/build.gradle b/grails-encoder/build.gradle
index 73504efd32..4dddf106e0 100644
--- a/grails-encoder/build.gradle
+++ b/grails-encoder/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/compat/build.gradle 
b/grails-events/compat/build.gradle
index 892c32cd60..b81524cfad 100644
--- a/grails-events/compat/build.gradle
+++ b/grails-events/compat/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/core/build.gradle b/grails-events/core/build.gradle
index 38d9198358..5aff3b6f02 100644
--- a/grails-events/core/build.gradle
+++ b/grails-events/core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/gpars/build.gradle b/grails-events/gpars/build.gradle
index c94fee9aa6..dac8116a22 100644
--- a/grails-events/gpars/build.gradle
+++ b/grails-events/gpars/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/plugin/build.gradle 
b/grails-events/plugin/build.gradle
index 1530d73768..f79fd19b1d 100644
--- a/grails-events/plugin/build.gradle
+++ b/grails-events/plugin/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/rxjava/build.gradle 
b/grails-events/rxjava/build.gradle
index ebb69b7437..01ad1535e6 100644
--- a/grails-events/rxjava/build.gradle
+++ b/grails-events/rxjava/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/rxjava2/build.gradle 
b/grails-events/rxjava2/build.gradle
index 0697285af6..edfe174a8a 100644
--- a/grails-events/rxjava2/build.gradle
+++ b/grails-events/rxjava2/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/rxjava3/build.gradle 
b/grails-events/rxjava3/build.gradle
index 040c9bb162..fd16cccd37 100644
--- a/grails-events/rxjava3/build.gradle
+++ b/grails-events/rxjava3/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/spring/build.gradle 
b/grails-events/spring/build.gradle
index abdba35721..9afcfbeada 100644
--- a/grails-events/spring/build.gradle
+++ b/grails-events/spring/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-events/transforms/build.gradle 
b/grails-events/transforms/build.gradle
index 6a43d17adf..f2b4f02a12 100644
--- a/grails-events/transforms/build.gradle
+++ b/grails-events/transforms/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-fields/build.gradle b/grails-fields/build.gradle
index 74b4fd64e5..790c20eb40 100644
--- a/grails-fields/build.gradle
+++ b/grails-fields/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
     id 'org.apache.grails.gradle.grails-plugin'
diff --git 
a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsPluginGradlePlugin.groovy
 
b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsPluginGradlePlugin.groovy
index bcb93974fe..25ba49e087 100644
--- 
a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsPluginGradlePlugin.groovy
+++ 
b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsPluginGradlePlugin.groovy
@@ -202,7 +202,7 @@ class GrailsPluginGradlePlugin extends GrailsGradlePlugin {
                 project.rootProject.logger.info('Warning - a javadocTask was 
not found, so the ast source will not be included in the javadoc task')
             }
 
-            Task groovydocTask = taskContainer.findByName('groovydoc')
+            Task groovydocTask = taskContainer.findByName('grailsGroovydoc') 
?: taskContainer.findByName('groovydoc')
             if (groovydocTask) {
                 if (taskContainer.findByName('javadocJar') == null) {
                     taskContainer.create("javadocJar", Jar) {
diff --git 
a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/doc/GrailsDocGradlePlugin.groovy
 
b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/doc/GrailsDocGradlePlugin.groovy
index 6c2dc0eef1..29f07da687 100644
--- 
a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/doc/GrailsDocGradlePlugin.groovy
+++ 
b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/doc/GrailsDocGradlePlugin.groovy
@@ -24,6 +24,7 @@ import org.gradle.api.Plugin
 import org.gradle.api.Project
 import org.gradle.api.Task
 import org.gradle.api.artifacts.Configuration
+import org.gradle.api.tasks.TaskProvider
 import org.gradle.api.tasks.javadoc.Groovydoc
 import org.gradle.api.tasks.javadoc.Javadoc
 
@@ -43,26 +44,25 @@ class GrailsDocGradlePlugin implements Plugin<Project> {
         Configuration docConfiguration = 
project.configurations.create(DOC_CONFIGURATION)
         project.dependencies.add(DOC_CONFIGURATION, 
"org.grails:grails-docs:${BuildSettings.getPackage().getImplementationVersion()}")
 
-        Groovydoc groovydocTask = 
(Groovydoc)project.tasks.findByName('groovydoc')
+        Groovydoc groovydocTask = 
(Groovydoc)(project.tasks.findByName('grailsGroovydoc') ?: 
project.tasks.findByName('groovydoc'))
         Javadoc javadocTask = (Javadoc)project.tasks.findByName('javadoc')
 
         if(groovydocTask && javadocTask) {
+            TaskProvider<PublishGuideTask> docsTask = 
project.tasks.register('docs', PublishGuideTask)
+            docsTask.configure {
+                it.classpath = docConfiguration
 
-            Task docsTask = project.tasks.create('docs', PublishGuideTask)
-
-            docsTask.classpath = docConfiguration
-
-            File applicationYml = 
project.file("${project.projectDir}/grails-app/conf/application.yml")
-            if(applicationYml.exists()) {
-                docsTask.propertiesFile = applicationYml
+                File applicationYml = 
project.layout.projectDirectory.file('grails-app/conf/application.yml').getAsFile()
+                if(applicationYml.exists()) {
+                    it.propertiesFile = applicationYml
+                }
+                it.destinationDir = 
project.file("${project.buildDir}/docs/manual")
+                it.source = project.file("${project.projectDir}/src/docs")
+                it.resourcesDir = 
project.file("${project.projectDir}/src/docs")
+                it.groovydocDir = groovydocTask.destinationDir
+                it.javadocDir = javadocTask.destinationDir
+                it.dependsOn(groovydocTask, javadocTask)
             }
-            docsTask.destinationDir = 
project.file("${project.buildDir}/docs/manual")
-            docsTask.source = project.file("${project.projectDir}/src/docs")
-            docsTask.resourcesDir = 
project.file("${project.projectDir}/src/docs")
-            docsTask.groovydocDir = groovydocTask.destinationDir
-            docsTask.javadocDir = javadocTask.destinationDir
-            docsTask.dependsOn(groovydocTask)
-            docsTask.dependsOn(javadocTask)
         }
     }
 }
diff --git 
a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/publishing/GrailsPublishGradlePlugin.groovy
 
b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/publishing/GrailsPublishGradlePlugin.groovy
index 8b6366528f..51c44dee09 100644
--- 
a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/publishing/GrailsPublishGradlePlugin.groovy
+++ 
b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/publishing/GrailsPublishGradlePlugin.groovy
@@ -509,7 +509,7 @@ Note: if project properties are used, the properties must 
be defined prior to ap
 
         final TaskContainer tasks = project.tasks
         tasks.named('javadoc').configure {
-            Task groovyDocTask = tasks.findByName('groovydoc')
+            Task groovyDocTask = tasks.findByName('grailsGroovydoc') ?: 
tasks.findByName('groovydoc')
             if (groovyDocTask) {
                 project.rootProject.logger.info('Configuring javadocJar task 
for project {} to include groovydoc', project.name)
                 it.enabled = false
@@ -522,7 +522,7 @@ Note: if project properties are used, the properties must 
be defined prior to ap
             jar.dirMode = 0755 // To avoid platform specific defaults
             jar.fileMode = 0644 // to avoid platform specific defaults
 
-            Groovydoc groovyDocTask = tasks.findByName('groovydoc')
+            Groovydoc groovyDocTask = tasks.findByName('grailsGroovydoc') ?: 
tasks.findByName('groovydoc')
             if (groovyDocTask) {
                 jar.dependsOn(groovyDocTask)
 
@@ -581,7 +581,7 @@ Note: if project properties are used, the properties must 
be defined prior to ap
 //        }
 
         registerValidationTask(project, 'grailsPublishValidation') {
-            Task groovyDocTask = project.tasks.findByName('groovydoc')
+            Task groovyDocTask = tasks.findByName('grailsGroovydoc') ?: 
project.tasks.findByName('groovydoc')
             if (groovyDocTask) {
                 if (!groovyDocTask.enabled) {
                     throw new RuntimeException('Groovydoc task is disabled. 
Please enable it to ensure javadoc can be published correctly with the Grails 
Publish Plugin.')
diff --git a/grails-gsp/core/build.gradle b/grails-gsp/core/build.gradle
index 30362e0b1f..4df1c90772 100644
--- a/grails-gsp/core/build.gradle
+++ b/grails-gsp/core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-gsp/grails-sitemesh3/build.gradle 
b/grails-gsp/grails-sitemesh3/build.gradle
index 19cf1c2bdf..022d63745c 100644
--- a/grails-gsp/grails-sitemesh3/build.gradle
+++ b/grails-gsp/grails-sitemesh3/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
     id 'org.apache.grails.gradle.grails-plugin'
diff --git a/grails-gsp/grails-taglib/build.gradle 
b/grails-gsp/grails-taglib/build.gradle
index fdb81e6d1c..0a45298b10 100644
--- a/grails-gsp/grails-taglib/build.gradle
+++ b/grails-gsp/grails-taglib/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'project-report'
     id 'java-library'
 }
diff --git a/grails-gsp/grails-web-gsp-taglib/build.gradle 
b/grails-gsp/grails-web-gsp-taglib/build.gradle
index 6c2deb3629..542d88f3bb 100644
--- a/grails-gsp/grails-web-gsp-taglib/build.gradle
+++ b/grails-gsp/grails-web-gsp-taglib/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'project-report'
     id 'java-library'
 }
diff --git a/grails-gsp/grails-web-gsp/build.gradle 
b/grails-gsp/grails-web-gsp/build.gradle
index ffc612da76..023e7b4e8c 100644
--- a/grails-gsp/grails-web-gsp/build.gradle
+++ b/grails-gsp/grails-web-gsp/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'project-report'
     id 'java-library'
 }
diff --git a/grails-gsp/grails-web-jsp/build.gradle 
b/grails-gsp/grails-web-jsp/build.gradle
index 63dbc6b172..22f57a61f8 100644
--- a/grails-gsp/grails-web-jsp/build.gradle
+++ b/grails-gsp/grails-web-jsp/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'project-report'
     id 'java-library'
 }
diff --git a/grails-gsp/grails-web-taglib/build.gradle 
b/grails-gsp/grails-web-taglib/build.gradle
index 1f9d94d0fa..0759d3a4af 100644
--- a/grails-gsp/grails-web-taglib/build.gradle
+++ b/grails-gsp/grails-web-taglib/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-gsp/plugin/build.gradle b/grails-gsp/plugin/build.gradle
index 45bce77b51..7313373f94 100644
--- a/grails-gsp/plugin/build.gradle
+++ b/grails-gsp/plugin/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
     id 'org.apache.grails.gradle.grails-plugin'
diff --git a/grails-i18n/build.gradle b/grails-i18n/build.gradle
index a07554dfbb..79d5042eaa 100644
--- a/grails-i18n/build.gradle
+++ b/grails-i18n/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-interceptors/build.gradle b/grails-interceptors/build.gradle
index 9e74dd99d2..08d63a3681 100644
--- a/grails-interceptors/build.gradle
+++ b/grails-interceptors/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-logging/build.gradle b/grails-logging/build.gradle
index 075f390df5..33719d7d07 100644
--- a/grails-logging/build.gradle
+++ b/grails-logging/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-mimetypes/build.gradle b/grails-mimetypes/build.gradle
index 127f78d775..8e62e710c6 100644
--- a/grails-mimetypes/build.gradle
+++ b/grails-mimetypes/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-profiles/base/build.gradle 
b/grails-profiles/base/build.gradle
index 1fd0cb869a..ffba384138 100644
--- a/grails-profiles/base/build.gradle
+++ b/grails-profiles/base/build.gradle
@@ -16,6 +16,7 @@
  */
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.apache.grails.gradle.grails-profile'
 }
 
diff --git a/grails-profiles/plugin/build.gradle 
b/grails-profiles/plugin/build.gradle
index e393d86e19..5294839f7a 100644
--- a/grails-profiles/plugin/build.gradle
+++ b/grails-profiles/plugin/build.gradle
@@ -16,6 +16,7 @@
  */
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.apache.grails.gradle.grails-profile'
 }
 
diff --git a/grails-profiles/profile/build.gradle 
b/grails-profiles/profile/build.gradle
index a01147e39a..7c3e2b1c41 100644
--- a/grails-profiles/profile/build.gradle
+++ b/grails-profiles/profile/build.gradle
@@ -16,6 +16,7 @@
  */
 plugins {
        id 'groovy'
+    id 'grails.groovydoc'
        id 'org.apache.grails.gradle.grails-profile'
 }
 
diff --git a/grails-profiles/rest-api-plugin/build.gradle 
b/grails-profiles/rest-api-plugin/build.gradle
index 0a39af6246..9171805972 100644
--- a/grails-profiles/rest-api-plugin/build.gradle
+++ b/grails-profiles/rest-api-plugin/build.gradle
@@ -16,6 +16,7 @@
  */
 plugins {
        id 'groovy'
+    id 'grails.groovydoc'
        id 'org.apache.grails.gradle.grails-profile'
 }
 
diff --git a/grails-profiles/rest-api/build.gradle 
b/grails-profiles/rest-api/build.gradle
index 0317dbd037..30d4104e3d 100644
--- a/grails-profiles/rest-api/build.gradle
+++ b/grails-profiles/rest-api/build.gradle
@@ -16,6 +16,7 @@
  */
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.apache.grails.gradle.grails-profile'
 }
 
diff --git a/grails-profiles/web-plugin/build.gradle 
b/grails-profiles/web-plugin/build.gradle
index c93ed03c8f..765780e81b 100644
--- a/grails-profiles/web-plugin/build.gradle
+++ b/grails-profiles/web-plugin/build.gradle
@@ -16,6 +16,7 @@
  */
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.apache.grails.gradle.grails-profile'
 }
 
diff --git a/grails-profiles/web/build.gradle b/grails-profiles/web/build.gradle
index f1a76aa15a..00b18a1597 100644
--- a/grails-profiles/web/build.gradle
+++ b/grails-profiles/web/build.gradle
@@ -16,6 +16,7 @@
  */
 plugins {
        id 'groovy'
+    id 'grails.groovydoc'
        id 'org.apache.grails.gradle.grails-profile'
 }
 
diff --git a/grails-rest-transforms/build.gradle 
b/grails-rest-transforms/build.gradle
index fa3402b68c..b866eecad3 100644
--- a/grails-rest-transforms/build.gradle
+++ b/grails-rest-transforms/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-services/build.gradle b/grails-services/build.gradle
index 47b9df936c..1005a01cf0 100644
--- a/grails-services/build.gradle
+++ b/grails-services/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-shell-cli/build.gradle b/grails-shell-cli/build.gradle
index d0bf08f576..f65a60e4ae 100644
--- a/grails-shell-cli/build.gradle
+++ b/grails-shell-cli/build.gradle
@@ -18,6 +18,7 @@
 plugins {
     id 'application'
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-spring/build.gradle b/grails-spring/build.gradle
index da9ddbfcf0..707a6138ee 100644
--- a/grails-spring/build.gradle
+++ b/grails-spring/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-test-core/build.gradle b/grails-test-core/build.gradle
index 14b625c5e3..66adf8be2b 100644
--- a/grails-test-core/build.gradle
+++ b/grails-test-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-test-examples/cache/build.gradle 
b/grails-test-examples/cache/build.gradle
index 59937677b7..5e3b777d28 100644
--- a/grails-test-examples/cache/build.gradle
+++ b/grails-test-examples/cache/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'idea'
     id 'eclipse'
 }
diff --git a/grails-test-examples/hibernate5/spring-boot-hibernate/build.gradle 
b/grails-test-examples/hibernate5/spring-boot-hibernate/build.gradle
index cfbcf4b49f..497fb56662 100644
--- a/grails-test-examples/hibernate5/spring-boot-hibernate/build.gradle
+++ b/grails-test-examples/hibernate5/spring-boot-hibernate/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.springframework.boot'
 }
 
diff --git a/grails-test-examples/hibernate5/standalone-hibernate/build.gradle 
b/grails-test-examples/hibernate5/standalone-hibernate/build.gradle
index 92a0e6a7a8..44143e8d63 100644
--- a/grails-test-examples/hibernate5/standalone-hibernate/build.gradle
+++ b/grails-test-examples/hibernate5/standalone-hibernate/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
 }
 
 version = '0.0.1'
diff --git a/grails-test-examples/views-functional-tests-plugin/build.gradle 
b/grails-test-examples/views-functional-tests-plugin/build.gradle
index 6365e81491..a617ed5128 100644
--- a/grails-test-examples/views-functional-tests-plugin/build.gradle
+++ b/grails-test-examples/views-functional-tests-plugin/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'org.apache.grails.gradle.grails-plugin'
     id 'org.apache.grails.gradle.grails-gson'
diff --git a/grails-test-examples/views-functional-tests/build.gradle 
b/grails-test-examples/views-functional-tests/build.gradle
index def877a221..d69712e57e 100644
--- a/grails-test-examples/views-functional-tests/build.gradle
+++ b/grails-test-examples/views-functional-tests/build.gradle
@@ -20,6 +20,7 @@
 plugins {
     id 'application'
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.apache.grails.gradle.grails-gsp'
     id 'org.apache.grails.gradle.grails-web'
     id 'asset-pipeline'
diff --git a/grails-test-suite-persistence/build.gradle 
b/grails-test-suite-persistence/build.gradle
index d00fd7ea9f..6bc154bbdb 100644
--- a/grails-test-suite-persistence/build.gradle
+++ b/grails-test-suite-persistence/build.gradle
@@ -87,28 +87,58 @@ dependencies {
     testImplementation 'org.objenesis:objenesis'
 }
 
-test {
-    maxParallelForks = configuredTestParallel
-    forkEvery = isCiBuild ? 25 : 100
-    if(!isCiBuild) {
-        maxHeapSize = '2048m'
+def testGrailsDomainBinder = tasks.register('testGrailsDomainBinder', Test)
+testGrailsDomainBinder.configure { Test it ->
+    onlyIf {
+        ![
+                'onlyFunctionalTests',
+                'onlyHibernate5Tests',
+                'onlyMongodbTests',
+                'skipCoreTests',
+                'skipTests'
+        ].find {
+            project.hasProperty(it)
+        }
     }
-    excludes = ['**/GrailsDomainBinderTests.class',
-                '**/ComponentValidationTests.class',
-                '**/HibernateMappingUniqueConstraintTests.class']
+
+    it.includes = [
+            '**/GrailsDomainBinderTests.class'
+    ]
 }
 
-task testGrailsDomainBinder(type: Test) { includes = [
-        '**/GrailsDomainBinderTests.class'
-    ] }
+def testIsolatedPersistentOne = tasks.register('testIsolatedPersistentOne', 
Test)
+testIsolatedPersistentOne.configure {Test it ->
+    onlyIf {
+        ![
+                'onlyFunctionalTests',
+                'onlyHibernate5Tests',
+                'onlyMongodbTests',
+                'skipCoreTests',
+                'skipTests'
+        ].find {
+            project.hasProperty(it)
+        }
+    }
 
+    it.includes = [
+            '**/ComponentValidationTests.class',
+            '**/HibernateMappingUniqueConstraintTests.class'
+    ]
+}
 
-task testIsolatedPersistentOne(type: Test) {
-    includes = ['**/ComponentValidationTests.class']
-    includes = ['**/HibernateMappingUniqueConstraintTests.class']
+tasks.named('test', Test).configure {Test it ->
+    it.dependsOn testGrailsDomainBinder, testIsolatedPersistentOne
+
+    it.maxParallelForks = configuredTestParallel
+    it.forkEvery = isCiBuild ? 25 : 100
+    if(!isCiBuild) {
+        it.maxHeapSize = '2048m'
+    }
+    it.excludes = ['**/GrailsDomainBinderTests.class',
+                '**/ComponentValidationTests.class',
+                '**/HibernateMappingUniqueConstraintTests.class']
 }
 
-test.dependsOn testGrailsDomainBinder, testIsolatedPersistentOne
 
 tasks.withType(Groovydoc).configureEach {
     // tests do not have groovydoc
diff --git a/grails-test-suite-uber/build.gradle 
b/grails-test-suite-uber/build.gradle
index 6af35c9af7..03e6e7e58d 100644
--- a/grails-test-suite-uber/build.gradle
+++ b/grails-test-suite-uber/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'project-report'
 }
 
diff --git a/grails-testing-support-core/build.gradle 
b/grails-testing-support-core/build.gradle
index e508918187..5f533c60e7 100644
--- a/grails-testing-support-core/build.gradle
+++ b/grails-testing-support-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-testing-support-datamapping/build.gradle 
b/grails-testing-support-datamapping/build.gradle
index cd25137390..89b4d8adc0 100755
--- a/grails-testing-support-datamapping/build.gradle
+++ b/grails-testing-support-datamapping/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-testing-support-mongodb/build.gradle 
b/grails-testing-support-mongodb/build.gradle
index ef7c10c8f7..4de4b7dbe4 100644
--- a/grails-testing-support-mongodb/build.gradle
+++ b/grails-testing-support-mongodb/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-testing-support-views-gson/build.gradle 
b/grails-testing-support-views-gson/build.gradle
index 1b9b9e9fec..6876037eb0 100644
--- a/grails-testing-support-views-gson/build.gradle
+++ b/grails-testing-support-views-gson/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-testing-support-web/build.gradle 
b/grails-testing-support-web/build.gradle
index 41509a8040..f910bffe80 100755
--- a/grails-testing-support-web/build.gradle
+++ b/grails-testing-support-web/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-url-mappings/build.gradle b/grails-url-mappings/build.gradle
index 7b3f7144a8..17f1420598 100644
--- a/grails-url-mappings/build.gradle
+++ b/grails-url-mappings/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-validation/build.gradle b/grails-validation/build.gradle
index d3a7c7f2f2..f4becbcc73 100644
--- a/grails-validation/build.gradle
+++ b/grails-validation/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-views-core/build.gradle b/grails-views-core/build.gradle
index b97851c866..5314bd96b3 100644
--- a/grails-views-core/build.gradle
+++ b/grails-views-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
 }
 
diff --git a/grails-views-gson/build.gradle b/grails-views-gson/build.gradle
index 3347c259d1..63b853e93e 100644
--- a/grails-views-gson/build.gradle
+++ b/grails-views-gson/build.gradle
@@ -20,6 +20,7 @@
 plugins {
     id 'java-library'
     id 'groovy'
+    id 'grails.groovydoc'
     id 'org.apache.grails.gradle.grails-plugin'
 }
 
diff --git a/grails-views-markup/build.gradle b/grails-views-markup/build.gradle
index c74317e8a5..648df1e09b 100644
--- a/grails-views-markup/build.gradle
+++ b/grails-views-markup/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'org.apache.grails.gradle.grails-plugin'
 }
diff --git a/grails-web-boot/build.gradle b/grails-web-boot/build.gradle
index c2fe2aaf83..5e86161628 100644
--- a/grails-web-boot/build.gradle
+++ b/grails-web-boot/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-web-common/build.gradle b/grails-web-common/build.gradle
index 703eaac6ce..ebcdc15837 100644
--- a/grails-web-common/build.gradle
+++ b/grails-web-common/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-web-core/build.gradle b/grails-web-core/build.gradle
index 027588c513..70ba3774d4 100644
--- a/grails-web-core/build.gradle
+++ b/grails-web-core/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-web-databinding/build.gradle 
b/grails-web-databinding/build.gradle
index 1d6e8d4e7f..dfc7f31cdd 100644
--- a/grails-web-databinding/build.gradle
+++ b/grails-web-databinding/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-web-mvc/build.gradle b/grails-web-mvc/build.gradle
index 6f9bad0ba5..6c289f6588 100644
--- a/grails-web-mvc/build.gradle
+++ b/grails-web-mvc/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }
diff --git a/grails-web-url-mappings/build.gradle 
b/grails-web-url-mappings/build.gradle
index f9b3bf36ef..4d03daa481 100644
--- a/grails-web-url-mappings/build.gradle
+++ b/grails-web-url-mappings/build.gradle
@@ -19,6 +19,7 @@
 
 plugins {
     id 'groovy'
+    id 'grails.groovydoc'
     id 'java-library'
     id 'project-report'
 }

Reply via email to