From d2f0ace247a1ff309dd6525ba58089d93c15b6a0 Mon Sep 17 00:00:00 2001 From: Scott Murphy Heiberg Date: Mon, 24 Nov 2025 20:20:25 -0700 Subject: [PATCH 1/6] fix version publishing --- .../groovy/org/apache/grails/buildsrc/PublishPlugin.groovy | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy index 492b2f18aa2..4b6ab30d453 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy @@ -183,12 +183,17 @@ class PublishPlugin implements Plugin { it.url.set('https://apache.org/') } it.developers.set(project.provider { lookupProperty(project, 'pomDevelopers', determineDevelopers(project))}) - it.pomCustomization = lookupProperty(project, 'pomCustomization') as Closure it.publishTestSources.set(project.provider { lookupProperty(project, 'pomPublishTestSources', false)}) it.testRepositoryPath.set(project.provider { shouldSkipJavaComponent(project) ? null : findRootGrailsCoreDir(project).dir('build/local-maven')}) it.publicationName.set(project.provider { lookupProperty(project, 'pomMavenPublicationName', 'maven')}) it.addComponents.set(project.provider { !shouldSkipJavaComponent(project) && !project.pluginManager.hasPlugin('java-gradle-plugin')}) } + + project.afterEvaluate { + project.extensions.configure(GrailsPublishExtension) { + it.pomCustomization = lookupProperty(project, 'pomCustomization') as Closure + } + } } private static void ensureJarContainsASFFiles(Project project) { From 92fac557cea40af50758524e9efb408a9bc32387 Mon Sep 17 00:00:00 2001 From: Scott Murphy Heiberg Date: Mon, 24 Nov 2025 20:22:09 -0700 Subject: [PATCH 2/6] fix for dependency management plugin overrides --- grails-bom/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/grails-bom/build.gradle b/grails-bom/build.gradle index 29b2e282ec2..fa5cbc5be24 100644 --- a/grails-bom/build.gradle +++ b/grails-bom/build.gradle @@ -20,6 +20,7 @@ import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator +import org.gradle.api.publish.tasks.GenerateModuleMetadata buildscript { apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') @@ -39,6 +40,12 @@ javaPlatform { allowDependencies() } +// Disable Gradle Module Metadata (.module files) for the BOM +// This allows properties to be overridden with the Spring dependency management plugin +tasks.withType(GenerateModuleMetadata).configureEach { + enabled = false +} + ext { isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') From 82179b1f787d92ccec2122564b35819c0d14b2d7 Mon Sep 17 00:00:00 2001 From: Scott Murphy Heiberg Date: Mon, 24 Nov 2025 22:14:52 -0700 Subject: [PATCH 3/6] use grails.version to eliminate 131 redundant versions --- .../tasks/bom/PropertyNameCalculator.groovy | 13 +++++++------ grails-bom/build.gradle | 16 ++++++++-------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/build-logic/docs-core/src/main/groovy/org/apache/grails/gradle/tasks/bom/PropertyNameCalculator.groovy b/build-logic/docs-core/src/main/groovy/org/apache/grails/gradle/tasks/bom/PropertyNameCalculator.groovy index 987860d5295..106ed6a127e 100644 --- a/build-logic/docs-core/src/main/groovy/org/apache/grails/gradle/tasks/bom/PropertyNameCalculator.groovy +++ b/build-logic/docs-core/src/main/groovy/org/apache/grails/gradle/tasks/bom/PropertyNameCalculator.groovy @@ -28,6 +28,8 @@ import org.gradle.api.plugins.JavaPlatformPlugin */ class PropertyNameCalculator { + static final String GRAILS_VERSION_PROPERTY = 'grails.version' + final Map keysToPlatformCoordinates = [:] final Map platformDefinitions = [:] @@ -41,22 +43,21 @@ class PropertyNameCalculator { this.versions.putAll(definitionVersions) } - void addProjects(Collection projects) { + void addProjects(Collection projects, String grailsVersion) { + versions.put(GRAILS_VERSION_PROPERTY, grailsVersion) + for (Project project : projects) { if (project.plugins.hasPlugin(JavaPlatformPlugin) || !project.extensions.findByName('grailsPublish')) { continue } String artifactId = (project.findProperty('pomArtifactId') ?: project.name) - String baseVersionName = artifactId.replaceAll('-', '.') - String versionName = "${baseVersionName}.version" as String String coordinates = "${project.group}:${artifactId}:${project.version}" as String ExtractedDependencyConstraint constraint = new ExtractedDependencyConstraint(coordinates as String) - constraint.versionPropertyReference = "\${${versionName}}" as String + constraint.versionPropertyReference = "\${${GRAILS_VERSION_PROPERTY}}" as String definitions.put(coordinates, constraint) - keysToCoordinates.put(coordinates, baseVersionName) - versions.put(versionName, project.version as String) + keysToCoordinates.put(coordinates, 'grails') } } diff --git a/grails-bom/build.gradle b/grails-bom/build.gradle index fa5cbc5be24..b75cb1cf6ac 100644 --- a/grails-bom/build.gradle +++ b/grails-bom/build.gradle @@ -167,6 +167,9 @@ ext { def deps = depMgmt?.dependencies?.getAt(0) if (deps) { Map pomProperties = [:] + PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) + propertyNameCalculator.addProjects(rootProject.subprojects, projectVersion) + deps.dependency.each { dep -> String groupId = dep.groupId.text().trim() String artifactId = dep.artifactId.text().trim() @@ -178,8 +181,6 @@ ext { } if (inlineVersion) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addProjects(rootProject.subprojects) ExtractedDependencyConstraint extractedConstraint = propertyNameCalculator.calculate(groupId, artifactId, inlineVersion, isBom) if (extractedConstraint?.versionPropertyReference) { // use the property reference instead of the hard coded version so that it can be @@ -190,18 +191,17 @@ ext { pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) } - if (gradle.includedBuilds*.any { it.name == artifactId && groupId.startsWith('org.apache.grails') }) { - String baseVersionName = artifactId.replaceAll('-', '.') - String versionName = "${baseVersionName}.version" as String - dep.version[0].value = "\${${versionName}}" as String - pomProperties.put(versionName, inlineVersion) + // For included builds (grails-gradle), also use grails.version + if (gradle.includedBuilds.any { it.name == artifactId && groupId.startsWith('org.apache.grails') }) { + dep.version[0].value = "\${${PropertyNameCalculator.GRAILS_VERSION_PROPERTY}}" as String + pomProperties.put(PropertyNameCalculator.GRAILS_VERSION_PROPERTY, inlineVersion) } } else if (!inlineVersion) { throw new GradleException("Dependency $groupId:$artifactId does not have a version.") } } - for (Map.Entry property : pomProperties.entrySet()) { + for (Map.Entry property : pomProperties.sort().entrySet()) { propertiesNode.appendNode(property.key, property.value) } } From f95445ffd0413e43fee647e7dec0654144f7599b Mon Sep 17 00:00:00 2001 From: Scott Murphy Heiberg Date: Mon, 24 Nov 2025 22:55:47 -0700 Subject: [PATCH 4/6] disable specific task --- grails-bom/build.gradle | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/grails-bom/build.gradle b/grails-bom/build.gradle index b75cb1cf6ac..23195d699c1 100644 --- a/grails-bom/build.gradle +++ b/grails-bom/build.gradle @@ -20,7 +20,6 @@ import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator -import org.gradle.api.publish.tasks.GenerateModuleMetadata buildscript { apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') @@ -40,10 +39,13 @@ javaPlatform { allowDependencies() } -// Disable Gradle Module Metadata (.module files) for the BOM +// Disable gradle (.module file) for the BOM only // This allows properties to be overridden with the Spring dependency management plugin -tasks.withType(GenerateModuleMetadata).configureEach { - enabled = false +// Also fixes older versions being resolved on transitive dependencies with updated parents +afterEvaluate { + tasks.named('generateMetadataFileForMavenPublication').configure { + enabled = false + } } ext { From 9690f5e01e800c08154369d151d5855693c0474e Mon Sep 17 00:00:00 2001 From: Scott Murphy Heiberg Date: Wed, 26 Nov 2025 13:32:50 -0800 Subject: [PATCH 5/6] revert PublisPlugin in favor of #15258 --- .../groovy/org/apache/grails/buildsrc/PublishPlugin.groovy | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy index 4b6ab30d453..492b2f18aa2 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy @@ -183,17 +183,12 @@ class PublishPlugin implements Plugin { it.url.set('https://apache.org/') } it.developers.set(project.provider { lookupProperty(project, 'pomDevelopers', determineDevelopers(project))}) + it.pomCustomization = lookupProperty(project, 'pomCustomization') as Closure it.publishTestSources.set(project.provider { lookupProperty(project, 'pomPublishTestSources', false)}) it.testRepositoryPath.set(project.provider { shouldSkipJavaComponent(project) ? null : findRootGrailsCoreDir(project).dir('build/local-maven')}) it.publicationName.set(project.provider { lookupProperty(project, 'pomMavenPublicationName', 'maven')}) it.addComponents.set(project.provider { !shouldSkipJavaComponent(project) && !project.pluginManager.hasPlugin('java-gradle-plugin')}) } - - project.afterEvaluate { - project.extensions.configure(GrailsPublishExtension) { - it.pomCustomization = lookupProperty(project, 'pomCustomization') as Closure - } - } } private static void ensureJarContainsASFFiles(Project project) { From 50e9af27b438904ef3fcb739a65bd5fbd2816b42 Mon Sep 17 00:00:00 2001 From: Scott Murphy Heiberg Date: Wed, 26 Nov 2025 13:36:23 -0800 Subject: [PATCH 6/6] disabling .module no longer needed --- grails-bom/build.gradle | 9 --------- 1 file changed, 9 deletions(-) diff --git a/grails-bom/build.gradle b/grails-bom/build.gradle index 23195d699c1..d18a3ef2060 100644 --- a/grails-bom/build.gradle +++ b/grails-bom/build.gradle @@ -39,15 +39,6 @@ javaPlatform { allowDependencies() } -// Disable gradle (.module file) for the BOM only -// This allows properties to be overridden with the Spring dependency management plugin -// Also fixes older versions being resolved on transitive dependencies with updated parents -afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - enabled = false - } -} - ext { isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID')