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

jdaugherty pushed a commit to branch compile-static-grails-publish
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit c2b4f5966eede659242d21ac5ec00ab02367335c
Author: James Daugherty <[email protected]>
AuthorDate: Wed May 28 16:30:14 2025 -0400

    WIP - compile static enhancement for grails publish plugin
---
 .../publishing/GrailsPublishGradlePlugin.groovy    | 332 +++++++++++----------
 1 file changed, 175 insertions(+), 157 deletions(-)

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 c5ff0049a1..3fcb5d3821 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
@@ -20,11 +20,20 @@ package org.grails.gradle.plugin.publishing
 
 import grails.util.GrailsNameUtils
 import groovy.namespace.QName
+import groovy.transform.CompileStatic
 import io.github.gradlenexus.publishplugin.InitializeNexusStagingRepository
+import io.github.gradlenexus.publishplugin.NexusPublishExtension
 import io.github.gradlenexus.publishplugin.NexusPublishPlugin
+import io.github.gradlenexus.publishplugin.NexusRepository
+import io.github.gradlenexus.publishplugin.NexusRepositoryContainer
+import org.gradle.api.NamedDomainObjectProvider
 import org.gradle.api.Plugin
 import org.gradle.api.Project
 import org.gradle.api.Task
+import org.gradle.api.XmlProvider
+import org.gradle.api.artifacts.dsl.RepositoryHandler
+import org.gradle.api.artifacts.repositories.MavenArtifactRepository
+import org.gradle.api.artifacts.repositories.PasswordCredentials
 import org.gradle.api.file.ConfigurableFileCollection
 import org.gradle.api.file.DuplicatesStrategy
 import org.gradle.api.plugins.ExtensionContainer
@@ -32,6 +41,10 @@ import org.gradle.api.plugins.ExtraPropertiesExtension
 import org.gradle.api.plugins.JavaPlatformExtension
 import org.gradle.api.plugins.JavaPluginExtension
 import org.gradle.api.plugins.PluginManager
+import org.gradle.api.publish.PublishingExtension
+import org.gradle.api.publish.maven.MavenPom
+import org.gradle.api.publish.maven.MavenPomDeveloperSpec
+import org.gradle.api.publish.maven.MavenPomLicenseSpec
 import org.gradle.api.publish.maven.MavenPublication
 import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
 import org.gradle.api.tasks.SourceSetContainer
@@ -111,6 +124,7 @@ Note: if project properties are used, the properties must 
be defined prior to ap
 """
     }
 
+    @CompileStatic
     @Override
     void apply(Project project) {
         project.rootProject.logger.info("Applying Grails Publish Gradle Plugin 
for `${project.name}`...");
@@ -176,21 +190,20 @@ Note: if project properties are used, the properties must 
be defined prior to ap
         projectPluginManager.apply(MavenPublishPlugin)
 
         boolean localSigning = false
-        if(isRelease) {
+        if (isRelease) {
             String signingKeyId = project.findProperty('signing.keyId') ?: 
System.getenv('SIGNING_KEY')
-            extraPropertiesExtension.setProperty('signing.keyId', signingKeyId)
+            extraPropertiesExtension.set('signing.keyId', signingKeyId)
             String secringFile = 
project.findProperty('signing.secretKeyRingFile') ?: 
System.getenv('SIGNING_KEYRING')
-            if(!secringFile) {
+            if (!secringFile) {
                 project.logger.info("No keyring file has been specified. 
Assuming the use of local gpgCommand instead.")
                 localSigning = true
-                extraPropertiesExtension.setProperty('signing.gnupg.keyName', 
signingKeyId)
-            }
-            else {
-                
extraPropertiesExtension.setProperty('signing.secretKeyRingFile', secringFile)
+                extraPropertiesExtension.set('signing.gnupg.keyName', 
signingKeyId)
+            } else {
+                extraPropertiesExtension.set('signing.secretKeyRingFile', 
secringFile)
 
                 String signingPassphrase = 
project.findProperty('signing.password') ?: System.getenv('SIGNING_PASSPHRASE')
-                if(signingPassphrase) {
-                    extraPropertiesExtension.setProperty('signing.password', 
signingPassphrase)
+                if (signingPassphrase) {
+                    extraPropertiesExtension.set('signing.password', 
signingPassphrase)
                 }
             }
         }
@@ -225,24 +238,25 @@ Note: if project properties are used, the properties must 
be defined prior to ap
             }
 
             if (!hasNexusPublishApplied) {
-                project.rootProject.nexusPublishing {
-                    if(nexusPublishDescription) {
-                        repositoryDescription = "${nexusPublishDescription}"
+                
project.rootProject.extensions.configure(NexusPublishExtension, { 
NexusPublishExtension it ->
+                    if (nexusPublishDescription) {
+                        it.repositoryDescription.set(nexusPublishDescription)
                     }
-                    repositories {
-                        sonatype {
+                    it.repositories { NexusRepositoryContainer repoContainer ->
+                        repoContainer.sonatype { NexusRepository repo ->
                             if (nexusPublishUrl) {
-                                nexusUrl = project.uri(nexusPublishUrl)
+                                repo.nexusUrl.set(project.uri(nexusPublishUrl))
                             }
                             if (nexusPublishSnapshotUrl) {
-                                snapshotRepositoryUrl = 
project.uri(nexusPublishSnapshotUrl)
+                                
repo.snapshotRepositoryUrl.set(project.uri(nexusPublishSnapshotUrl))
                             }
-                            username = nexusPublishUsername
-                            password = nexusPublishPassword
-                            stagingProfileId = nexusPublishStagingProfileId
+
+                            repo.username.set(nexusPublishUsername)
+                            repo.password.set(nexusPublishPassword)
+                            
repo.stagingProfileId.set(nexusPublishStagingProfileId)
                         }
                     }
-                }
+                })
             }
         }
 
@@ -251,193 +265,197 @@ Note: if project properties are used, the properties 
must be defined prior to ap
 
             validateProjectPublishable(project as Project)
 
-            project.publishing {
+            project.extensions.configure(PublishingExtension, { 
PublishingExtension pe ->
                 final def mavenPublishUrl = 
project.findProperty('mavenPublishUrl') ?: System.getenv('MAVEN_PUBLISH_URL')
                 if (useMavenPublish) {
                     
System.setProperty('org.gradle.internal.publish.checksums.insecure', true as 
String)
 
-                    repositories {
-                        maven {
+                    pe.repositories { RepositoryHandler repoHandler ->
+                        repoHandler.maven { MavenArtifactRepository repo ->
                             final String mavenPublishUsername = 
project.findProperty('mavenPublishUsername') ?: 
System.getenv('MAVEN_PUBLISH_USERNAME')
                             final String mavenPublishPassword = 
project.findProperty('mavenPublishPassword') ?: 
System.getenv('MAVEN_PUBLISH_PASSWORD')
                             if (mavenPublishUsername && mavenPublishPassword) {
-                                credentials {
-                                    username = mavenPublishUsername
-                                    password = mavenPublishPassword
+                                repo.credentials { PasswordCredentials 
credentials ->
+                                    credentials.username = mavenPublishUsername
+                                    credentials.password = mavenPublishPassword
                                 }
                             }
-                            url = mavenPublishUrl
+                            repo.url = mavenPublishUrl
                         }
                     }
                 }
 
-                final GrailsPublishExtension gpe = 
extensionContainer.findByType(GrailsPublishExtension)
-                publications {
-                    maven(MavenPublication) {
-                        delegate.artifactId = gpe.artifactId ?: project.name
-                        delegate.groupId = gpe.groupId ?: project.group
+                pe.publications {
+                    NamedDomainObjectProvider<MavenPublication> 
mavenPublication = it.register('maven', MavenPublication) { MavenPublication 
publication ->
+                        final GrailsPublishExtension gpe = 
extensionContainer.findByType(GrailsPublishExtension)
+                        publication.artifactId = gpe.artifactId ?: project.name
+                        publication.groupId = gpe.groupId ?: project.group
+
+                        doAddArtefact(project, publication)
 
-                        doAddArtefact(project, delegate)
                         def extraArtefact = getDefaultExtraArtifact(project)
                         if (extraArtefact) {
-                            artifact extraArtefact
+                            publication.artifact extraArtefact
                         }
 
-                        pom.withXml {
-                            Node pomNode = asNode()
+                        publication.pom { MavenPom pom ->
+                            if (gpe != null) {
+                                String title = gpe.title ?: project.name
+                                pom.name.set(title)
+                                pom.description.set(gpe.desc ?: title)
 
-                            if 
(!project.extensions.findByType(JavaPlatformExtension)) {
-                                // Prevent multiple dependencyManagement nodes
-                                if (pomNode.dependencyManagement) {
-                                    
pomNode.dependencyManagement[0].replaceNode {}
+                                String websiteUrl = gpe.websiteUrl ?: 
gpe.githubSlug ? "https://github.com/$gpe.githubSlug"; : ''
+                                if (!websiteUrl) {
+                                    throw new 
RuntimeException(getErrorMessage('websiteUrl'))
                                 }
-                            }
-
-                            if (gpe != null) {
-                                pomNode.children().last() + {
-                                    def title = gpe.title ?: project.name
-                                    delegate.name title
-                                    delegate.description gpe.desc ?: title
-
-                                    def websiteUrl = gpe.websiteUrl ?: 
gpe.githubSlug ? "https://github.com/$gpe.githubSlug"; : ''
-                                    if (!websiteUrl) {
-                                        throw new 
RuntimeException(getErrorMessage('websiteUrl'))
-                                    }
-                                    delegate.url websiteUrl
-
-                                    def license = gpe.license
-                                    if (license != null) {
-                                        def concreteLicense = 
GrailsPublishExtension.License.LICENSES.get(license.name)
-                                        if (concreteLicense != null) {
-                                            delegate.licenses {
-                                                delegate.license {
-                                                    delegate.name 
concreteLicense.name
-                                                    delegate.url 
concreteLicense.url
-                                                    delegate.distribution 
concreteLicense.distribution
-                                                }
+                                pom.url.set(websiteUrl)
+                                GrailsPublishExtension.License license = 
gpe.license
+                                if (license) {
+                                    GrailsPublishExtension.License 
concreteLicense = GrailsPublishExtension.License.LICENSES.get(license.name)
+                                    if (concreteLicense) {
+                                        pom.licenses { MavenPomLicenseSpec 
spec ->
+                                            spec.license {
+                                                
it.name.set(concreteLicense.name)
+                                                it.url.set(concreteLicense.url)
+                                                
it.distribution.set(concreteLicense.distribution)
                                             }
-                                        } else if (license.name && 
license.url) {
-                                            delegate.licenses {
-                                                delegate.license {
-                                                    delegate.name license.name
-                                                    delegate.url license.url
-                                                    delegate.distribution 
license.distribution
-                                                }
+                                        }
+                                    } else if (license.name && license.url) {
+                                        pom.licenses { MavenPomLicenseSpec 
spec ->
+                                            spec.license {
+                                                it.name.set(license.name)
+                                                it.url.set(license.url)
+                                                
it.distribution.set(license.distribution)
                                             }
                                         }
-                                    } else {
-                                        throw new 
RuntimeException(getErrorMessage('license'))
                                     }
+                                } else {
+                                    throw new 
RuntimeException(getErrorMessage('license'))
+                                }
 
-                                    if (gpe.githubSlug) {
-                                        delegate.scm {
-                                            delegate.url 
"https://github.com/$gpe.githubSlug";
-                                            delegate.connection 
"scm:[email protected]:${gpe.githubSlug}.git"
-                                            delegate.developerConnection 
"scm:[email protected]:${gpe.githubSlug}.git"
-                                        }
-                                        delegate.issueManagement {
-                                            delegate.system 'Github Issues'
-                                            delegate.url 
"https://github.com/$gpe.githubSlug/issues";
+                                if (gpe.githubSlug) {
+                                    pom.scm {
+                                        
it.url.set("https://github.com/$gpe.githubSlug"; as String)
+                                        
it.connection.set("scm:[email protected]:${gpe.githubSlug}.git" as String)
+                                        
it.developerConnection.set("scm:[email protected]:${gpe.githubSlug}.git" as 
String)
+                                    }
+                                    pom.issueManagement {
+                                        it.system.set('Github Issues')
+                                        
it.url.set("https://github.com/$gpe.githubSlug/issues"; as String)
+                                    }
+                                } else {
+                                    if (gpe.vcsUrl) {
+                                        pom.scm {
+                                            it.url.set(gpe.vcsUrl)
+                                            
it.connection.set("scm:$gpe.vcsUrl" as String)
+                                            
it.developerConnection.set("scm:$gpe.vcsUrl" as String)
                                         }
                                     } else {
-                                        if (gpe.vcsUrl) {
-                                            delegate.scm {
-                                                delegate.url gpe.vcsUrl
-                                                delegate.connection 
"scm:$gpe.vcsUrl"
-                                                delegate.developerConnection 
"scm:$gpe.vcsUrl"
-                                            }
-                                        } else {
-                                            throw new 
RuntimeException(getErrorMessage('vcsUrl'))
-                                        }
+                                        throw new 
RuntimeException(getErrorMessage('vcsUrl'))
+                                    }
 
-                                        if (gpe.issueTrackerUrl) {
-                                            delegate.issueManagement {
-                                                delegate.system 'Issue Tracker'
-                                                delegate.url 
gpe.issueTrackerUrl
-                                            }
-                                        } else {
-                                            throw new 
RuntimeException(getErrorMessage('issueTrackerUrl'))
+                                    if (gpe.issueTrackerUrl) {
+                                        pom.issueManagement {
+                                            it.system.set('Issue Tracker')
+                                            it.url.set(gpe.issueTrackerUrl)
                                         }
+                                    } else {
+                                        throw new 
RuntimeException(getErrorMessage('issueTrackerUrl'))
                                     }
+                                }
 
-                                    if (gpe.developers) {
-                                        delegate.developers {
-                                            for (entry in 
gpe.developers.entrySet()) {
-                                                delegate.developer {
-                                                    delegate.id entry.key
-                                                    delegate.name entry.value
-                                                }
+                                if (gpe.developers) {
+                                    pom.developers { MavenPomDeveloperSpec 
spec ->
+                                        for (entry in 
gpe.developers.entrySet()) {
+                                            spec.developer {
+                                                it.id.set(entry.key)
+                                                it.name.set(entry.value)
                                             }
                                         }
-                                    } else {
-                                        throw new 
RuntimeException(getErrorMessage('developers'))
                                     }
+                                } else {
+                                    throw new 
RuntimeException(getErrorMessage('developers'))
                                 }
-
                             }
 
-                            if (gpe.pomCustomization) {
-                                gpe.pomCustomization.delegate = delegate
-                                gpe.pomCustomization.resolveStrategy = 
Closure.DELEGATE_FIRST
-                                gpe.pomCustomization.call()
-                            }
+                            pom.withXml { XmlProvider xml ->
+                                Node pomNode = xml.asNode()
 
-                            // fix dependencies without a version
-                            def mavenPomNamespace = 
'http://maven.apache.org/POM/4.0.0'
-                            def dependenciesQName = new 
QName(mavenPomNamespace, 'dependencies')
-                            def dependencyQName = new QName(mavenPomNamespace, 
'dependency')
-                            def versionQName = new QName(mavenPomNamespace, 
'version')
-                            def groupIdQName = new QName(mavenPomNamespace, 
'groupId')
-                            def artifactIdQName = new QName(mavenPomNamespace, 
'artifactId')
-                            def nodes = (pomNode.getAt(dependenciesQName) as 
NodeList)
-                            if (nodes) {
-                                def dependencyNodes = (nodes.first() as 
Node).getAt(dependencyQName)
-                                dependencyNodes.findAll { dependencyNode ->
-                                    def versionNodes = (dependencyNode as 
Node).getAt(versionQName)
-                                    return versionNodes.size() == 0 || 
(versionNodes.first() as Node).text().isEmpty()
-                                }.each { dependencyNode ->
-                                    def groupId = ((dependencyNode as 
Node).getAt(groupIdQName).first() as Node).text()
-                                    def artifactId = ((dependencyNode as 
Node).getAt(artifactIdQName).first() as Node).text()
-                                    def resolvedArtifacts = 
project.configurations.compileClasspath.resolvedConfiguration.resolvedArtifacts 
+
-                                            
project.configurations.runtimeClasspath.resolvedConfiguration.resolvedArtifacts
-                                    if 
(project.configurations.hasProperty('testFixturesCompileClasspath')) {
-                                        resolvedArtifacts += 
project.configurations.testFixturesCompileClasspath.resolvedConfiguration.resolvedArtifacts
 +
-                                                
project.configurations.testFixturesRuntimeClasspath.resolvedConfiguration.resolvedArtifacts
-                                    }
-                                    def managedVersion = 
resolvedArtifacts.find {
-                                        it.moduleVersion.id.group == groupId &&
-                                                it.moduleVersion.id.name == 
artifactId
-                                    }?.moduleVersion?.id?.version
-                                    if (!managedVersion) {
-                                        throw new RuntimeException("No version 
found for dependency $groupId:$artifactId.")
-                                    }
-                                    def versionNode = (dependencyNode as 
Node).getAt(versionQName)
-                                    if (versionNode) {
-                                        (versionNode.first() as Node).value = 
managedVersion
-                                    } else {
-                                        (dependencyNode as 
Node).appendNode('version', managedVersion)
+                                if 
(!project.extensions.findByType(JavaPlatformExtension)) {
+                                    // Prevent multiple dependencyManagement 
nodes
+                                    List<Node> dependencyManagementList = 
pomNode.get("dependencyManagement") as List<Node>
+                                    if (dependencyManagementList) {
+                                        Node dependencyManagementNode = 
dependencyManagementList[0]
+                                        dependencyManagementNode.replaceNode {}
                                     }
                                 }
+
+                                if (gpe.pomCustomization) {
+                                    gpe.pomCustomization.delegate = xml
+                                    gpe.pomCustomization.resolveStrategy = 
Closure.DELEGATE_FIRST
+                                    gpe.pomCustomization.call()
+                                }
+
+                                fixUnversionedDependencies(pomNode, project)
                             }
                         }
                     }
-                }
-            }
 
-            if (isRelease) {
-                extensionContainer.configure(SigningExtension, {
-                    it.required = isRelease
-                    if(localSigning) {
-                        it.useGpgCmd()
+                    if (isRelease) {
+                        extensionContainer.configure(SigningExtension, { 
SigningExtension signing ->
+                            signing.required = isRelease
+                            if (localSigning) {
+                                signing.useGpgCmd()
+                            }
+                            signing.sign mavenPublication.get()
+                        })
                     }
-                    it.sign project.publishing.publications.maven
-                })
-            }
+                }
+            })
 
             addInstallTaskAliases(project)
         }
     }
 
+    private void fixUnversionedDependencies(Node pomNode, project) {
+        def mavenPomNamespace = 'http://maven.apache.org/POM/4.0.0'
+        def dependenciesQName = new QName(mavenPomNamespace, 'dependencies')
+        def dependencyQName = new QName(mavenPomNamespace, 'dependency')
+        def versionQName = new QName(mavenPomNamespace, 'version')
+        def groupIdQName = new QName(mavenPomNamespace, 'groupId')
+        def artifactIdQName = new QName(mavenPomNamespace, 'artifactId')
+        def nodes = (pomNode.getAt(dependenciesQName) as NodeList)
+        if (nodes) {
+            def dependencyNodes = (nodes.first() as 
Node).getAt(dependencyQName)
+            dependencyNodes.findAll { dependencyNode ->
+                def versionNodes = (dependencyNode as Node).getAt(versionQName)
+                return versionNodes.size() == 0 || (versionNodes.first() as 
Node).text().isEmpty()
+            }.each { dependencyNode ->
+                def groupId = ((dependencyNode as 
Node).getAt(groupIdQName).first() as Node).text()
+                def artifactId = ((dependencyNode as 
Node).getAt(artifactIdQName).first() as Node).text()
+                def resolvedArtifacts = 
project.configurations.compileClasspath.resolvedConfiguration.resolvedArtifacts 
+
+                        
project.configurations.runtimeClasspath.resolvedConfiguration.resolvedArtifacts
+                if 
(project.configurations.hasProperty('testFixturesCompileClasspath')) {
+                    resolvedArtifacts += 
project.configurations.testFixturesCompileClasspath.resolvedConfiguration.resolvedArtifacts
 +
+                            
project.configurations.testFixturesRuntimeClasspath.resolvedConfiguration.resolvedArtifacts
+                }
+                def managedVersion = resolvedArtifacts.find {
+                    it.moduleVersion.id.group == groupId &&
+                            it.moduleVersion.id.name == artifactId
+                }?.moduleVersion?.id?.version
+                if (!managedVersion) {
+                    throw new RuntimeException("No version found for 
dependency $groupId:$artifactId.")
+                }
+                def versionNode = (dependencyNode as Node).getAt(versionQName)
+                if (versionNode) {
+                    (versionNode.first() as Node).value = managedVersion
+                } else {
+                    (dependencyNode as Node).appendNode('version', 
managedVersion)
+                }
+            }
+        }
+    }
+
     protected void addInstallTaskAliases(Project project) {
         final TaskContainer taskContainer = project.tasks
         def installTask = taskContainer.findByName('install')

Reply via email to