diff --git a/build-logic/plugins/build.gradle b/build-logic/plugins/build.gradle index c75af3b4ab6..57e73a5a82c 100644 --- a/build-logic/plugins/build.gradle +++ b/build-logic/plugins/build.gradle @@ -35,6 +35,7 @@ project.layout.projectDirectory.file('../../gradle.properties').asFile.withInput } dependencies { + implementation project(':grails-docs-core') implementation "${gradleBomDependencies['grails-publish-plugin']}" implementation "org.gradle.crypto.checksum:org.gradle.crypto.checksum.gradle.plugin:${gradleProperties.gradleChecksumPluginVersion}" implementation "org.cyclonedx.bom:org.cyclonedx.bom.gradle.plugin:${gradleProperties.gradleCycloneDxPluginVersion}" @@ -64,6 +65,10 @@ gradlePlugin { id = 'org.apache.grails.buildsrc.sbom' implementationClass = 'org.apache.grails.buildsrc.SbomPlugin' } + register('bomConventionsPlugin') { + id = 'org.apache.grails.buildsrc.bom-conventions' + implementationClass = 'org.apache.grails.buildsrc.BomConventionsPlugin' + } register('sharedPropertyPlugin') { id = 'org.apache.grails.buildsrc.properties' implementationClass = 'org.apache.grails.buildsrc.SharedPropertyPlugin' diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/BomConventionsPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/BomConventionsPlugin.groovy new file mode 100644 index 00000000000..1d23e6a9567 --- /dev/null +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/BomConventionsPlugin.groovy @@ -0,0 +1,261 @@ +/* + * 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.buildsrc + +import groovy.transform.CompileDynamic +import groovy.transform.CompileStatic + +import org.gradle.api.GradleException +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.artifacts.Dependency +import org.gradle.api.plugins.JavaPlatformExtension +import org.gradle.api.tasks.TaskProvider + +import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask +import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint +import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator + +@CompileStatic +class BomConventionsPlugin implements Plugin { + + private static final String BASE_CONSTRAINTS_FILE = 'grails-bom-constraints.adoc' + + private static final Set MICRONAUT_BOM_PROJECTS = [ + 'grails-hibernate5-micronaut-bom', + 'grails-hibernate7-micronaut-bom', + 'grails-micronaut-bom', + ] as Set + + private static final Map GRADLE_BUILD_PROJECTS = [ + 'grails-gradle-plugins': 'org.apache.grails', + 'grails-gradle-model' : 'org.apache.grails.gradle', + 'grails-gradle-common' : 'org.apache.grails.gradle', + 'grails-gradle-tasks' : 'org.apache.grails', + ] + + @Override + void apply(Project project) { + applyDependencyDefinitions(project) + configureCoordinates(project) + configureExtraProperties(project) + configurePomCustomization(project) + + project.pluginManager.apply('java-platform') + project.extensions.configure(JavaPlatformExtension) { JavaPlatformExtension extension -> + extension.allowDependencies() + } + project.pluginManager.apply('org.apache.grails.buildsrc.publish') + project.pluginManager.apply('org.apache.grails.buildsrc.sbom') + + configureBomDependencies(project) + configureExtractConstraints(project) + configureSnapshotValidation(project) + } + + private static void applyDependencyDefinitions(Project project) { + project.apply([from: project.rootProject.layout.projectDirectory.file('dependencies.gradle')]) + } + + private static void configureCoordinates(Project project) { + project.version = project.findProperty('projectVersion') + project.group = 'org.apache.grails' + } + + private static void configureExtraProperties(Project project) { + project.extensions.extraProperties.set('isReleaseBuild', System.getenv('GRAILS_PUBLISH_RELEASE') == 'true') + project.extensions.extraProperties.set( + 'isPublishedExternal', + System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') + ) + project.extensions.extraProperties.set('gradleBuildProjects', new LinkedHashMap(GRADLE_BUILD_PROJECTS)) + } + + private static void configureBomDependencies(Project project) { + project.configurations.register('bomDependencies') { Configuration configuration -> + configuration.canBeResolved = true + configuration.transitive = true + configuration.extendsFrom(project.configurations.named('api').get()) + } + } + + private static void configureExtractConstraints(Project project) { + TaskProvider extractConstraints = project.tasks.register( + 'extractConstraints', + ExtractDependenciesTask + ) { ExtractDependenciesTask task -> + task.captureProjectServices(project.dependencies, project.configurations) + task.setConfiguration(project.configurations.named('bomDependencies')) + task.destination.set(project.layout.buildDirectory.file(constraintsFileName(project))) + task.platformDefinitions.set(project.provider { getStringMap(project, 'combinedPlatforms') }) + task.definitions.set(project.provider { getStringMap(project, 'combinedDependencies') }) + task.projectName.set(project.name) + task.versions.set(project.provider { getStringMap(project, 'combinedVersions') }) + task.autoRegisterTransitivePlatforms.set(MICRONAUT_BOM_PROJECTS.contains(project.name)) + + project.rootProject.subprojects.each { Project subproject -> + project.evaluationDependsOn(subproject.path) + } + task.projectArtifactIds.set(project.provider { projectArtifactIds(project) }) + task.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) + task.projectCoordinateProperties.set(project.provider { projectCoordinateProperties(project) }) + task.dependsOn('generateMetadataFileForMavenPublication', 'generatePomFileForMavenPublication') + } + + project.tasks.named('check') { Task task -> + task.dependsOn(extractConstraints) + } + } + + private static String constraintsFileName(Project project) { + project.name == 'grails-base-bom' ? BASE_CONSTRAINTS_FILE : "${project.name}-constraints.adoc" + } + + private static Map projectArtifactIds(Project project) { + Map artifactIdMappings = [:] + project.rootProject.subprojects.each { Project subproject -> + artifactIdMappings[subproject.name] = (subproject.findProperty('pomArtifactId') ?: subproject.name).toString() + } + + getGradleBuildProjects(project).each { String dependencyName, String dependencyGroup -> + artifactIdMappings[dependencyName] = dependencyName + } + + artifactIdMappings + } + + private static Map projectCoordinateProperties(Project project) { + Map projectCoordinates = [:] + project.rootProject.subprojects.each { Project subproject -> + String artifactId = (subproject.findProperty('pomArtifactId') ?: subproject.name).toString() + String baseVersionName = artifactId.replaceAll('[.]', '-') + projectCoordinates["${subproject.group}:${artifactId}:${subproject.version}".toString()] = baseVersionName + } + + getGradleBuildProjects(project).each { String dependencyName, String dependencyGroup -> + projectCoordinates["${dependencyGroup}:${dependencyName}:${project.version}".toString()] = dependencyName + } + + projectCoordinates + } + + private static void configureSnapshotValidation(Project project) { + TaskProvider validateNoSnapshotDependencies = project.tasks.register('validateNoSnapshotDependencies') { Task task -> + task.group = 'publishing' + task.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' + + task.doLast { + project.configurations.each { Configuration configuration -> + configuration.allDependencies.each { Dependency dependency -> + if (dependency.version && dependency.version.contains('-SNAPSHOT')) { + throw new GradleException( + "Releases cannot have a snapshot dependency: ${dependency.group}:${dependency.name} (${dependency.version})" + ) + } + } + } + } + } + + if (project.extensions.extraProperties.get('isReleaseBuild') && + project.extensions.extraProperties.get('isPublishedExternal')) { + project.tasks.matching { Task task -> + task.name in ['generateMetadataFileForMavenPublication', 'generatePomFileForMavenPublication'] + }.configureEach { Task task -> + task.dependsOn(validateNoSnapshotDependencies) + } + } + } + + private static void configurePomCustomization(Project project) { + project.extensions.extraProperties.set('pomCustomization', createPomCustomization(project)) + } + + @CompileDynamic + private static Closure createPomCustomization(Project project) { + { xml -> + def root = xml.asNode() + + def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') + + def depMgmt = root.dependencyManagement?.getAt(0) + def deps = depMgmt?.dependencies?.getAt(0) + if (deps) { + PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator( + getStringMap(project, 'combinedPlatforms'), + getStringMap(project, 'combinedDependencies'), + getStringMap(project, 'combinedVersions') + ) + propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') + propertyNameCalculator.addProjects(project.rootProject.subprojects) + getGradleBuildProjects(project).each { String gradleArtifactId, String dependencyGroup -> + propertyNameCalculator.addProject( + dependencyGroup, + gradleArtifactId, + project.version as String, + gradleArtifactId + ) + } + + Map pomProperties = [:] + deps.dependency.each { dep -> + String groupId = dep.groupId.text().trim() + String artifactId = dep.artifactId.text().trim() + boolean isBom = dep.scope.text().trim() == 'import' + + String inlineVersion = dep.version.text().trim() + if (inlineVersion == 'null') { + inlineVersion = null + } + + if (inlineVersion) { + ExtractedDependencyConstraint extractedConstraint = propertyNameCalculator.calculate( + groupId, + artifactId, + inlineVersion, + isBom + ) + if (extractedConstraint?.versionPropertyReference) { + dep.version[0].value = extractedConstraint.versionPropertyReference + pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) + } + } else if (!inlineVersion) { + throw new GradleException("Dependency $groupId:$artifactId does not have a version.") + } + } + + for (Map.Entry property : pomProperties.entrySet()) { + propertiesNode.appendNode(property.key, property.value) + } + } + } + } + + @SuppressWarnings('unchecked') + private static Map getStringMap(Project project, String propertyName) { + (Map) project.extensions.extraProperties.get(propertyName) + } + + private static Map getGradleBuildProjects(Project project) { + getStringMap(project, 'gradleBuildProjects') + } +} diff --git a/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/BomConventionsPluginSpec.groovy b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/BomConventionsPluginSpec.groovy new file mode 100644 index 00000000000..2017749bb45 --- /dev/null +++ b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/BomConventionsPluginSpec.groovy @@ -0,0 +1,126 @@ +/* + * 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.buildsrc + +import java.nio.file.Path + +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import spock.lang.Specification +import spock.lang.TempDir + +class BomConventionsPluginSpec extends Specification { + + @TempDir + Path testProjectDir + + def setup() { + testProjectDir.resolve('settings.gradle').toFile().text = '' + testProjectDir.resolve('.asf.yaml').toFile().text = '' + testProjectDir.resolve('gradle.properties').toFile().text = 'projectVersion=1.2.3\n' + testProjectDir.resolve('dependencies.gradle').toFile().text = '' + testProjectDir.resolve('build.gradle').toFile().text = ''' + plugins { + id 'org.apache.grails.gradle.grails-publish' + id 'org.apache.grails.buildsrc.bom-conventions' + } + + ext.combinedPlatforms = [:] + ext.combinedDependencies = [:] + ext.combinedVersions = [:] + + tasks.register('verifyBomConventions') { + doLast { + assert plugins.hasPlugin('java-platform') + assert project.group == 'org.apache.grails' + assert project.version.toString() == '1.2.3' + assert project.configurations.bomDependencies.canBeResolved + assert project.configurations.bomDependencies.extendsFrom.contains(project.configurations.api) + assert project.tasks.findByName('extractConstraints') + assert project.tasks.findByName('validateNoSnapshotDependencies') + assert project.ext.pomCustomization instanceof Closure + } + } + + tasks.register('writeCustomizedPom') { + doLast { + def root = new Node(null, 'project') + root.appendNode('properties') + def dependencies = root.appendNode('dependencyManagement').appendNode('dependencies') + addDependency(dependencies, 'org.apache.grails', 'grails-gradle-plugins') + addDependency(dependencies, 'org.apache.grails.gradle', 'grails-gradle-common') + + project.ext.pomCustomization.call(new Expando(asNode: { root })) + + def writer = new StringWriter() + new groovy.xml.XmlNodePrinter(new PrintWriter(writer)).print(root) + def pomFile = file("$buildDir/customized-pom.xml") + pomFile.parentFile.mkdirs() + pomFile.text = writer.toString() + } + } + + void addDependency(Node dependencies, String groupId, String artifactId) { + def dependency = dependencies.appendNode('dependency') + dependency.appendNode('groupId', groupId) + dependency.appendNode('artifactId', artifactId) + dependency.appendNode('version', project.version.toString()) + dependency.appendNode('scope', 'compile') + } + ''' + } + + def "plugin wires shared BOM conventions"() { + when: + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('verifyBomConventions', '--stacktrace') + .withPluginClasspath() + .build() + + then: + result.task(':verifyBomConventions').outcome == TaskOutcome.SUCCESS + } + + def "pom customization registers Gradle build projects with their configured groups"() { + when: + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('writeCustomizedPom', '--stacktrace') + .withPluginClasspath() + .build() + + then: + result.task(':writeCustomizedPom').outcome == TaskOutcome.SUCCESS + + and: + def pom = testProjectDir.resolve('build/customized-pom.xml').toFile().text + def xml = new groovy.xml.XmlSlurper().parseText(pom) + xml.properties.'grails-gradle-plugins.version'.text().trim() == '1.2.3' + xml.properties.'grails-gradle-common.version'.text().trim() == '1.2.3' + xml.dependencyManagement.dependencies.dependency.find { + it.groupId.text().trim() == 'org.apache.grails' && + it.artifactId.text().trim() == 'grails-gradle-plugins' + }.version.text().trim() == '${grails-gradle-plugins.version}' + xml.dependencyManagement.dependencies.dependency.find { + it.groupId.text().trim() == 'org.apache.grails.gradle' && + it.artifactId.text().trim() == 'grails-gradle-common' + }.version.text().trim() == '${grails-gradle-common.version}' + } +} diff --git a/dependencies.gradle b/dependencies.gradle index 72bd87a6b38..fda731a4387 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -20,6 +20,18 @@ // This file provides the 'grails-bom' dependencies, while grails-gradle/dependencies.gradle provides the 'grails-gradle-bom' dependencies // These files are split to facilitate separation of build vs application dependencies. These are the application dependencies. +static Map groovyModuleDependencies(String groovyVersion) { + [ + '', '-ant', '-astbuilder', '-cli-commons', '-cli-picocli', '-console', '-contracts', '-datetime', + '-dateutil', '-docgenerator', '-ginq', '-groovydoc', '-groovysh', '-jmx', '-json', '-jsr223', + '-macro', '-macro-library', '-nio', '-servlet', '-sql', '-swing', '-templates', '-test', + '-test-junit5', '-testng', '-toml', '-typecheckers', '-xml', '-yaml', + ].collectEntries { String moduleSuffix -> + String artifactId = "groovy${moduleSuffix}" + [(artifactId): "org.apache.groovy:${artifactId}:${groovyVersion}".toString()] + } +} + ext { gradleBomDependencyVersions = [ 'ant.version' : '1.10.17', @@ -287,37 +299,7 @@ ext { 'spock.version' : '2.4-groovy-5.0', ] combinedVersions += customBomVersions - customBomDependencies = [ - 'groovy' : "org.apache.groovy:groovy:${combinedVersions['groovy.version']}", - 'groovy-ant' : "org.apache.groovy:groovy-ant:${combinedVersions['groovy.version']}", - 'groovy-astbuilder' : "org.apache.groovy:groovy-astbuilder:${combinedVersions['groovy.version']}", - 'groovy-cli-commons' : "org.apache.groovy:groovy-cli-commons:${combinedVersions['groovy.version']}", - 'groovy-cli-picocli' : "org.apache.groovy:groovy-cli-picocli:${combinedVersions['groovy.version']}", - 'groovy-console' : "org.apache.groovy:groovy-console:${combinedVersions['groovy.version']}", - 'groovy-contracts' : "org.apache.groovy:groovy-contracts:${combinedVersions['groovy.version']}", - 'groovy-datetime' : "org.apache.groovy:groovy-datetime:${combinedVersions['groovy.version']}", - 'groovy-dateutil' : "org.apache.groovy:groovy-dateutil:${combinedVersions['groovy.version']}", - 'groovy-docgenerator' : "org.apache.groovy:groovy-docgenerator:${combinedVersions['groovy.version']}", - 'groovy-ginq' : "org.apache.groovy:groovy-ginq:${combinedVersions['groovy.version']}", - 'groovy-groovydoc' : "org.apache.groovy:groovy-groovydoc:${combinedVersions['groovy.version']}", - 'groovy-groovysh' : "org.apache.groovy:groovy-groovysh:${combinedVersions['groovy.version']}", - 'groovy-jmx' : "org.apache.groovy:groovy-jmx:${combinedVersions['groovy.version']}", - 'groovy-json' : "org.apache.groovy:groovy-json:${combinedVersions['groovy.version']}", - 'groovy-jsr223' : "org.apache.groovy:groovy-jsr223:${combinedVersions['groovy.version']}", - 'groovy-macro' : "org.apache.groovy:groovy-macro:${combinedVersions['groovy.version']}", - 'groovy-macro-library' : "org.apache.groovy:groovy-macro-library:${combinedVersions['groovy.version']}", - 'groovy-nio' : "org.apache.groovy:groovy-nio:${combinedVersions['groovy.version']}", - 'groovy-servlet' : "org.apache.groovy:groovy-servlet:${combinedVersions['groovy.version']}", - 'groovy-sql' : "org.apache.groovy:groovy-sql:${combinedVersions['groovy.version']}", - 'groovy-swing' : "org.apache.groovy:groovy-swing:${combinedVersions['groovy.version']}", - 'groovy-templates' : "org.apache.groovy:groovy-templates:${combinedVersions['groovy.version']}", - 'groovy-test' : "org.apache.groovy:groovy-test:${combinedVersions['groovy.version']}", - 'groovy-test-junit5' : "org.apache.groovy:groovy-test-junit5:${combinedVersions['groovy.version']}", - 'groovy-testng' : "org.apache.groovy:groovy-testng:${combinedVersions['groovy.version']}", - 'groovy-toml' : "org.apache.groovy:groovy-toml:${combinedVersions['groovy.version']}", - 'groovy-typecheckers' : "org.apache.groovy:groovy-typecheckers:${combinedVersions['groovy.version']}", - 'groovy-xml' : "org.apache.groovy:groovy-xml:${combinedVersions['groovy.version']}", - 'groovy-yaml' : "org.apache.groovy:groovy-yaml:${combinedVersions['groovy.version']}", + customBomDependencies = groovyModuleDependencies(combinedVersions['groovy.version']) + [ 'hibernate-core-jakarta': "org.hibernate:hibernate-core-jakarta:${combinedVersions['hibernate.version']}", 'hibernate-ehcache' : "org.hibernate:hibernate-ehcache:${combinedVersions['hibernate.version']}", 'hibernate-envers' : "org.hibernate:hibernate-envers:${combinedVersions['hibernate.version']}", @@ -357,36 +339,7 @@ ext { combinedVersions += customBomVersions customBomDependencies = [ 'cache-ri-impl' : "org.jsr107.ri:cache-ri-impl:${combinedVersions['cache-ri-impl.version']}", - 'groovy' : "org.apache.groovy:groovy:${combinedVersions['groovy.version']}", - 'groovy-ant' : "org.apache.groovy:groovy-ant:${combinedVersions['groovy.version']}", - 'groovy-astbuilder' : "org.apache.groovy:groovy-astbuilder:${combinedVersions['groovy.version']}", - 'groovy-cli-commons' : "org.apache.groovy:groovy-cli-commons:${combinedVersions['groovy.version']}", - 'groovy-cli-picocli' : "org.apache.groovy:groovy-cli-picocli:${combinedVersions['groovy.version']}", - 'groovy-console' : "org.apache.groovy:groovy-console:${combinedVersions['groovy.version']}", - 'groovy-contracts' : "org.apache.groovy:groovy-contracts:${combinedVersions['groovy.version']}", - 'groovy-datetime' : "org.apache.groovy:groovy-datetime:${combinedVersions['groovy.version']}", - 'groovy-dateutil' : "org.apache.groovy:groovy-dateutil:${combinedVersions['groovy.version']}", - 'groovy-docgenerator' : "org.apache.groovy:groovy-docgenerator:${combinedVersions['groovy.version']}", - 'groovy-ginq' : "org.apache.groovy:groovy-ginq:${combinedVersions['groovy.version']}", - 'groovy-groovydoc' : "org.apache.groovy:groovy-groovydoc:${combinedVersions['groovy.version']}", - 'groovy-groovysh' : "org.apache.groovy:groovy-groovysh:${combinedVersions['groovy.version']}", - 'groovy-jmx' : "org.apache.groovy:groovy-jmx:${combinedVersions['groovy.version']}", - 'groovy-json' : "org.apache.groovy:groovy-json:${combinedVersions['groovy.version']}", - 'groovy-jsr223' : "org.apache.groovy:groovy-jsr223:${combinedVersions['groovy.version']}", - 'groovy-macro' : "org.apache.groovy:groovy-macro:${combinedVersions['groovy.version']}", - 'groovy-macro-library' : "org.apache.groovy:groovy-macro-library:${combinedVersions['groovy.version']}", - 'groovy-nio' : "org.apache.groovy:groovy-nio:${combinedVersions['groovy.version']}", - 'groovy-servlet' : "org.apache.groovy:groovy-servlet:${combinedVersions['groovy.version']}", - 'groovy-sql' : "org.apache.groovy:groovy-sql:${combinedVersions['groovy.version']}", - 'groovy-swing' : "org.apache.groovy:groovy-swing:${combinedVersions['groovy.version']}", - 'groovy-templates' : "org.apache.groovy:groovy-templates:${combinedVersions['groovy.version']}", - 'groovy-test' : "org.apache.groovy:groovy-test:${combinedVersions['groovy.version']}", - 'groovy-test-junit5' : "org.apache.groovy:groovy-test-junit5:${combinedVersions['groovy.version']}", - 'groovy-testng' : "org.apache.groovy:groovy-testng:${combinedVersions['groovy.version']}", - 'groovy-toml' : "org.apache.groovy:groovy-toml:${combinedVersions['groovy.version']}", - 'groovy-typecheckers' : "org.apache.groovy:groovy-typecheckers:${combinedVersions['groovy.version']}", - 'groovy-xml' : "org.apache.groovy:groovy-xml:${combinedVersions['groovy.version']}", - 'groovy-yaml' : "org.apache.groovy:groovy-yaml:${combinedVersions['groovy.version']}", + ] + groovyModuleDependencies(combinedVersions['groovy.version']) + [ 'hibernate-core' : "org.hibernate.orm:hibernate-core:${combinedVersions['hibernate.version']}", 'hibernate-envers' : "org.hibernate.orm:hibernate-envers:${combinedVersions['hibernate.version']}", 'hibernate-jcache' : "org.hibernate.orm:hibernate-jcache:${combinedVersions['hibernate.version']}", @@ -419,68 +372,7 @@ ext { // grails-micronaut-bom project. Declared with `strictly` in the BOM project so // they win over Micronaut platform's higher versions when consumers use // enforcedPlatform(:grails-micronaut-bom). - else if (project.name in (['grails-hibernate7-micronaut-bom'])) { - customBomVersions = [ - 'liquibase-hibernate.version': '4.27.0', - 'liquibase.version' : '4.27.0', - 'hibernate.version' : '5.6.15.Final', - 'groovy.version' : '5.0.7', - 'spock.version' : '2.4-groovy-5.0', - 'protobuf.version': '4.30.2', - 'asm.version' : '9.10.1', - ] - combinedVersions += customBomVersions - customBomDependencies = [ - 'liquibase' : "org.liquibase:liquibase:${combinedVersions['liquibase.version']}", - 'liquibase-cdi' : "org.liquibase:liquibase-cdi:${combinedVersions['liquibase.version']}", - 'liquibase-core' : "org.liquibase:liquibase-core:${combinedVersions['liquibase.version']}", - 'liquibase-hibernate' : "org.liquibase.ext:liquibase-hibernate5:${combinedVersions['liquibase-hibernate.version']}", - 'hibernate-core-jakarta': "org.hibernate:hibernate-core-jakarta:${combinedVersions['hibernate.version']}", - 'hibernate-ehcache' : "org.hibernate:hibernate-ehcache:${combinedVersions['hibernate.version']}", - 'groovy' : "org.apache.groovy:groovy:${combinedVersions['groovy.version']}", - 'groovy-ant' : "org.apache.groovy:groovy-ant:${combinedVersions['groovy.version']}", - 'groovy-astbuilder' : "org.apache.groovy:groovy-astbuilder:${combinedVersions['groovy.version']}", - 'groovy-cli-commons' : "org.apache.groovy:groovy-cli-commons:${combinedVersions['groovy.version']}", - 'groovy-cli-picocli' : "org.apache.groovy:groovy-cli-picocli:${combinedVersions['groovy.version']}", - 'groovy-console' : "org.apache.groovy:groovy-console:${combinedVersions['groovy.version']}", - 'groovy-contracts' : "org.apache.groovy:groovy-contracts:${combinedVersions['groovy.version']}", - 'groovy-datetime' : "org.apache.groovy:groovy-datetime:${combinedVersions['groovy.version']}", - 'groovy-dateutil' : "org.apache.groovy:groovy-dateutil:${combinedVersions['groovy.version']}", - 'groovy-docgenerator' : "org.apache.groovy:groovy-docgenerator:${combinedVersions['groovy.version']}", - 'groovy-ginq' : "org.apache.groovy:groovy-ginq:${combinedVersions['groovy.version']}", - 'groovy-groovydoc' : "org.apache.groovy:groovy-groovydoc:${combinedVersions['groovy.version']}", - 'groovy-groovysh' : "org.apache.groovy:groovy-groovysh:${combinedVersions['groovy.version']}", - 'groovy-jmx' : "org.apache.groovy:groovy-jmx:${combinedVersions['groovy.version']}", - 'groovy-json' : "org.apache.groovy:groovy-json:${combinedVersions['groovy.version']}", - 'groovy-jsr223' : "org.apache.groovy:groovy-jsr223:${combinedVersions['groovy.version']}", - 'groovy-macro' : "org.apache.groovy:groovy-macro:${combinedVersions['groovy.version']}", - 'groovy-macro-library' : "org.apache.groovy:groovy-macro-library:${combinedVersions['groovy.version']}", - 'groovy-nio' : "org.apache.groovy:groovy-nio:${combinedVersions['groovy.version']}", - 'groovy-servlet' : "org.apache.groovy:groovy-servlet:${combinedVersions['groovy.version']}", - 'groovy-sql' : "org.apache.groovy:groovy-sql:${combinedVersions['groovy.version']}", - 'groovy-swing' : "org.apache.groovy:groovy-swing:${combinedVersions['groovy.version']}", - 'groovy-templates' : "org.apache.groovy:groovy-templates:${combinedVersions['groovy.version']}", - 'groovy-test' : "org.apache.groovy:groovy-test:${combinedVersions['groovy.version']}", - 'groovy-test-junit5' : "org.apache.groovy:groovy-test-junit5:${combinedVersions['groovy.version']}", - 'groovy-testng' : "org.apache.groovy:groovy-testng:${combinedVersions['groovy.version']}", - 'groovy-toml' : "org.apache.groovy:groovy-toml:${combinedVersions['groovy.version']}", - 'groovy-typecheckers' : "org.apache.groovy:groovy-typecheckers:${combinedVersions['groovy.version']}", - 'groovy-xml' : "org.apache.groovy:groovy-xml:${combinedVersions['groovy.version']}", - 'groovy-yaml' : "org.apache.groovy:groovy-yaml:${combinedVersions['groovy.version']}", - 'protobuf-java' : "com.google.protobuf:protobuf-java:${combinedVersions['protobuf.version']}", - 'asm' : "org.ow2.asm:asm:${combinedVersions['asm.version']}", - 'asm-util' : "org.ow2.asm:asm-util:${combinedVersions['asm.version']}", - 'spock-core' : "org.spockframework:spock-core:${combinedVersions['spock.version']}", - 'spock-spring' : "org.spockframework:spock-spring:${combinedVersions['spock.version']}", - ] - def customBomPlatformDependencies = [ - 'groovy-bom': "org.apache.groovy:groovy-bom:${combinedVersions['groovy.version']}", - 'spock-bom' : "org.spockframework:spock-bom:${combinedVersions['spock.version']}", - ] - bomPlatformDependencies += customBomPlatformDependencies - combinedDependencies += customBomDependencies - combinedPlatforms += customBomPlatformDependencies - } else if (project.name in ['grails-micronaut-bom', 'grails-hibernate5-micronaut-bom']) { + else if (project.name == 'grails-micronaut-bom') { customBomVersions = [ 'liquibase-hibernate.version': '4.27.0', 'liquibase.version' : '4.27.0', @@ -498,36 +390,7 @@ ext { 'liquibase-hibernate' : "org.liquibase.ext:liquibase-hibernate5:${combinedVersions['liquibase-hibernate.version']}", 'hibernate-core-jakarta': "org.hibernate:hibernate-core-jakarta:${combinedVersions['hibernate.version']}", 'hibernate-ehcache' : "org.hibernate:hibernate-ehcache:${combinedVersions['hibernate.version']}", - 'groovy' : "org.apache.groovy:groovy:${combinedVersions['groovy.version']}", - 'groovy-ant' : "org.apache.groovy:groovy-ant:${combinedVersions['groovy.version']}", - 'groovy-astbuilder' : "org.apache.groovy:groovy-astbuilder:${combinedVersions['groovy.version']}", - 'groovy-cli-commons' : "org.apache.groovy:groovy-cli-commons:${combinedVersions['groovy.version']}", - 'groovy-cli-picocli' : "org.apache.groovy:groovy-cli-picocli:${combinedVersions['groovy.version']}", - 'groovy-console' : "org.apache.groovy:groovy-console:${combinedVersions['groovy.version']}", - 'groovy-contracts' : "org.apache.groovy:groovy-contracts:${combinedVersions['groovy.version']}", - 'groovy-datetime' : "org.apache.groovy:groovy-datetime:${combinedVersions['groovy.version']}", - 'groovy-dateutil' : "org.apache.groovy:groovy-dateutil:${combinedVersions['groovy.version']}", - 'groovy-docgenerator' : "org.apache.groovy:groovy-docgenerator:${combinedVersions['groovy.version']}", - 'groovy-ginq' : "org.apache.groovy:groovy-ginq:${combinedVersions['groovy.version']}", - 'groovy-groovydoc' : "org.apache.groovy:groovy-groovydoc:${combinedVersions['groovy.version']}", - 'groovy-groovysh' : "org.apache.groovy:groovy-groovysh:${combinedVersions['groovy.version']}", - 'groovy-jmx' : "org.apache.groovy:groovy-jmx:${combinedVersions['groovy.version']}", - 'groovy-json' : "org.apache.groovy:groovy-json:${combinedVersions['groovy.version']}", - 'groovy-jsr223' : "org.apache.groovy:groovy-jsr223:${combinedVersions['groovy.version']}", - 'groovy-macro' : "org.apache.groovy:groovy-macro:${combinedVersions['groovy.version']}", - 'groovy-macro-library' : "org.apache.groovy:groovy-macro-library:${combinedVersions['groovy.version']}", - 'groovy-nio' : "org.apache.groovy:groovy-nio:${combinedVersions['groovy.version']}", - 'groovy-servlet' : "org.apache.groovy:groovy-servlet:${combinedVersions['groovy.version']}", - 'groovy-sql' : "org.apache.groovy:groovy-sql:${combinedVersions['groovy.version']}", - 'groovy-swing' : "org.apache.groovy:groovy-swing:${combinedVersions['groovy.version']}", - 'groovy-templates' : "org.apache.groovy:groovy-templates:${combinedVersions['groovy.version']}", - 'groovy-test' : "org.apache.groovy:groovy-test:${combinedVersions['groovy.version']}", - 'groovy-test-junit5' : "org.apache.groovy:groovy-test-junit5:${combinedVersions['groovy.version']}", - 'groovy-testng' : "org.apache.groovy:groovy-testng:${combinedVersions['groovy.version']}", - 'groovy-toml' : "org.apache.groovy:groovy-toml:${combinedVersions['groovy.version']}", - 'groovy-typecheckers' : "org.apache.groovy:groovy-typecheckers:${combinedVersions['groovy.version']}", - 'groovy-xml' : "org.apache.groovy:groovy-xml:${combinedVersions['groovy.version']}", - 'groovy-yaml' : "org.apache.groovy:groovy-yaml:${combinedVersions['groovy.version']}", + ] + groovyModuleDependencies(combinedVersions['groovy.version']) + [ 'protobuf-java' : "com.google.protobuf:protobuf-java:${combinedVersions['protobuf.version']}", 'asm' : "org.ow2.asm:asm:${combinedVersions['asm.version']}", 'asm-util' : "org.ow2.asm:asm-util:${combinedVersions['asm.version']}", diff --git a/grails-bom/base/build.gradle b/grails-bom/base/build.gradle index 40b833f9677..18d1047f6c0 100644 --- a/grails-bom/base/build.gradle +++ b/grails-bom/base/build.gradle @@ -17,37 +17,8 @@ * under the License. */ -import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask -import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint -import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator - -buildscript { - apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') -} - plugins { - id 'java-platform' - id 'org.apache.grails.buildsrc.publish' - id 'org.apache.grails.buildsrc.sbom' -} - -version = projectVersion -group = 'org.apache.grails' - -javaPlatform { - allowDependencies() -} - -ext { - isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' - isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') - // TODO: It should be possible to pull these build names using includedBuild, but I haven't found a way to do so - gradleBuildProjects = [ - 'grails-gradle-plugins':'org.apache.grails', - 'grails-gradle-model':'org.apache.grails.gradle', - 'grails-gradle-common':'org.apache.grails.gradle', - 'grails-gradle-tasks':'org.apache.grails', - ] + id 'org.apache.grails.buildsrc.bom-conventions' } dependencies { @@ -97,130 +68,4 @@ dependencies { } } -configurations.register('bomDependencies').configure { - it.canBeResolved = true - it.transitive = true - it.extendsFrom(configurations.named('api').get()) -} - -tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it -> - it.captureProjectServices(project.dependencies, project.configurations) - it.configuration = configurations.named('bomDependencies') - it.configurationName = 'bomDependencies' - it.destination = project.layout.buildDirectory.file('grails-bom-constraints.adoc') - it.platformDefinitions = combinedPlatforms - it.definitions = combinedDependencies - it.projectName = project.name - it.versions = combinedVersions - rootProject.subprojects.each { p -> - evaluationDependsOn(p.path) - } - it.projectArtifactIds.set(project.provider { - Map artifactIdMappings = [:] - - rootProject.subprojects.each { p -> - artifactIdMappings[p.name] = p.findProperty('pomArtifactId') ?: p.name - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - artifactIdMappings[dependency.key] = dependency.key - } - - artifactIdMappings - }) - it.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) - it.projectCoordinateProperties.set(project.provider { - Map projectCoordinates = [:] - - rootProject.subprojects.each { p -> - String artifactId = p.findProperty('pomArtifactId') as String ?: p.name - String baseVersionName = artifactId.replaceAll('[.]', '-') - projectCoordinates["${p.group}:${ artifactId}:${p.version}" as String] = baseVersionName - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - projectCoordinates["${dependency.value}:${dependency.key}:${project.version}" as String] = dependency.key - } - - projectCoordinates - }) - - it.dependsOn(project.tasks.named('generateMetadataFileForMavenPublication'), project.tasks.named('generatePomFileForMavenPublication')) -} - -def validateNoSnapshotDependencies = tasks.register('validateNoSnapshotDependencies') -validateNoSnapshotDependencies.configure { Task it -> - it.group = 'publishing' - it.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' - - it.doLast { - configurations.each { config -> - config.allDependencies.each { dep -> - if (dep.version && dep.version.contains('-SNAPSHOT')) { - throw new GradleException("Releases cannot have a snapshot dependency: ${dep.group}:${dep.name} (${dep.version})") - } - } - } - } -} - -if (ext.isReleaseBuild && ext.isPublishedExternal) { - project.afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - tasks.named('generatePomFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - } -} - -ext { - pomDescription = 'Grails BOM (Bill of Materials) for managing dependency versions used by Grails Projects' - pomCustomization = { xml -> - def root = xml.asNode() - - def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') - - def depMgmt = root.dependencyManagement?.getAt(0) - def deps = depMgmt?.dependencies?.getAt(0) - if (deps) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') - propertyNameCalculator.addProjects(rootProject.subprojects) - for (String gradleArtifactId : project.ext.gradleBuildProjects) { - propertyNameCalculator.addProject('org.apache.grails.gradle', gradleArtifactId, project.version as String, gradleArtifactId) - } - - Map pomProperties = [:] - deps.dependency.each { dep -> - String groupId = dep.groupId.text().trim() - String artifactId = dep.artifactId.text().trim() - boolean isBom = dep.scope.text().trim() == 'import' - - String inlineVersion = dep.version.text().trim() - if (inlineVersion == 'null') { - inlineVersion = null - } - - if (inlineVersion) { - 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 - // overridden by project properties (gradle.properties or ext['property.name']) - dep.version[0].value = extractedConstraint.versionPropertyReference - - // Add an entry in the node with the actual version number - pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) - } - } else if (!inlineVersion) { - throw new GradleException("Dependency $groupId:$artifactId does not have a version.") - } - } - - for (Map.Entry property : pomProperties.entrySet()) { - propertiesNode.appendNode(property.key, property.value) - } - } - } -} +ext.pomDescription = 'Grails BOM (Bill of Materials) for managing dependency versions used by Grails Projects' diff --git a/grails-bom/default/build.gradle b/grails-bom/default/build.gradle index 9e7f04dbec8..b79b42d3251 100644 --- a/grails-bom/default/build.gradle +++ b/grails-bom/default/build.gradle @@ -17,37 +17,8 @@ * under the License. */ -import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask -import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint -import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator - -buildscript { - apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') -} - plugins { - id 'java-platform' - id 'org.apache.grails.buildsrc.publish' - id 'org.apache.grails.buildsrc.sbom' -} - -version = projectVersion -group = 'org.apache.grails' - -javaPlatform { - allowDependencies() -} - -ext { - isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' - isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') - // TODO: It should be possible to pull these build names using includedBuild, but I haven't found a way to do so - gradleBuildProjects = [ - 'grails-gradle-plugins':'org.apache.grails', - 'grails-gradle-model':'org.apache.grails.gradle', - 'grails-gradle-common':'org.apache.grails.gradle', - 'grails-gradle-tasks':'org.apache.grails', - ] + id 'org.apache.grails.buildsrc.bom-conventions' } dependencies { @@ -85,130 +56,4 @@ dependencies { } } -configurations.register('bomDependencies').configure { - it.canBeResolved = true - it.transitive = true - it.extendsFrom(configurations.named('api').get()) -} - -tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it -> - it.captureProjectServices(project.dependencies, project.configurations) - it.configuration = configurations.named('bomDependencies') - it.configurationName = 'bomDependencies' - it.destination = project.layout.buildDirectory.file('grails-bom-constraints.adoc') - it.platformDefinitions = combinedPlatforms - it.definitions = combinedDependencies - it.projectName = project.name - it.versions = combinedVersions - rootProject.subprojects.each { p -> - evaluationDependsOn(p.path) - } - it.projectArtifactIds.set(project.provider { - Map artifactIdMappings = [:] - - rootProject.subprojects.each { p -> - artifactIdMappings[p.name] = p.findProperty('pomArtifactId') ?: p.name - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - artifactIdMappings[dependency.key] = dependency.key - } - - artifactIdMappings - }) - it.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) - it.projectCoordinateProperties.set(project.provider { - Map projectCoordinates = [:] - - rootProject.subprojects.each { p -> - String artifactId = p.findProperty('pomArtifactId') as String ?: p.name - String baseVersionName = artifactId.replaceAll('[.]', '-') - projectCoordinates["${p.group}:${ artifactId}:${p.version}" as String] = baseVersionName - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - projectCoordinates["${dependency.value}:${dependency.key}:${project.version}" as String] = dependency.key - } - - projectCoordinates - }) - - it.dependsOn(project.tasks.named('generateMetadataFileForMavenPublication'), project.tasks.named('generatePomFileForMavenPublication')) -} - -def validateNoSnapshotDependencies = tasks.register('validateNoSnapshotDependencies') -validateNoSnapshotDependencies.configure { Task it -> - it.group = 'publishing' - it.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' - - it.doLast { - configurations.each { config -> - config.allDependencies.each { dep -> - if (dep.version && dep.version.contains('-SNAPSHOT')) { - throw new GradleException("Releases cannot have a snapshot dependency: ${dep.group}:${dep.name} (${dep.version})") - } - } - } - } -} - -if (ext.isReleaseBuild && ext.isPublishedExternal) { - project.afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - tasks.named('generatePomFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - } -} - -ext { - pomDescription = 'Grails BOM (Bill of Materials) for managing dependency versions used by Grails Projects' - pomCustomization = { xml -> - def root = xml.asNode() - - def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') - - def depMgmt = root.dependencyManagement?.getAt(0) - def deps = depMgmt?.dependencies?.getAt(0) - if (deps) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') - propertyNameCalculator.addProjects(rootProject.subprojects) - for (String gradleArtifactId : project.ext.gradleBuildProjects) { - propertyNameCalculator.addProject('org.apache.grails.gradle', gradleArtifactId, project.version as String, gradleArtifactId) - } - - Map pomProperties = [:] - deps.dependency.each { dep -> - String groupId = dep.groupId.text().trim() - String artifactId = dep.artifactId.text().trim() - boolean isBom = dep.scope.text().trim() == 'import' - - String inlineVersion = dep.version.text().trim() - if (inlineVersion == 'null') { - inlineVersion = null - } - - if (inlineVersion) { - 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 - // overriden by the spring boot dependency management plugin - dep.version[0].value = extractedConstraint.versionPropertyReference - - // Add an entry in the node with the actual version number - pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) - } - } else if (!inlineVersion) { - throw new GradleException("Dependency $groupId:$artifactId does not have a version.") - } - } - - for (Map.Entry property : pomProperties.entrySet()) { - propertiesNode.appendNode(property.key, property.value) - } - } - } -} +ext.pomDescription = 'Grails BOM (Bill of Materials) for managing dependency versions used by Grails Projects' diff --git a/grails-bom/hibernate5-micronaut/build.gradle b/grails-bom/hibernate5-micronaut/build.gradle index 6dcbc33759c..485a550e81c 100644 --- a/grails-bom/hibernate5-micronaut/build.gradle +++ b/grails-bom/hibernate5-micronaut/build.gradle @@ -17,37 +17,8 @@ * under the License. */ -import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask -import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint -import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator - -buildscript { - apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') -} - plugins { - id 'java-platform' - id 'org.apache.grails.buildsrc.publish' - id 'org.apache.grails.buildsrc.sbom' -} - -version = projectVersion -group = 'org.apache.grails' - -javaPlatform { - allowDependencies() -} - -ext { - isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' - isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') - // TODO: It should be possible to pull these build names using includedBuild, but I haven't found a way to do so - gradleBuildProjects = [ - 'grails-gradle-plugins':'org.apache.grails', - 'grails-gradle-model':'org.apache.grails.gradle', - 'grails-gradle-common':'org.apache.grails.gradle', - 'grails-gradle-tasks':'org.apache.grails', - ] + id 'org.apache.grails.buildsrc.bom-conventions' } // Register the Micronaut platform in combinedPlatforms/combinedVersions so @@ -126,135 +97,4 @@ dependencies { } } -configurations.register('bomDependencies').configure { - it.canBeResolved = true - it.transitive = true - it.extendsFrom(configurations.named('api').get()) -} - -tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it -> - it.captureProjectServices(project.dependencies, project.configurations) - it.configuration = configurations.named('bomDependencies') - it.configurationName = 'bomDependencies' - it.destination = project.layout.buildDirectory.file('grails-hibernate5-micronaut-bom-constraints.adoc') - it.platformDefinitions = combinedPlatforms - it.definitions = combinedDependencies - it.projectName = project.name - it.versions = combinedVersions - // Micronaut's platform imports many sub-BOMs (micronaut-*-bom, netty-bom, etc.) that are - // not explicitly registered in dependencies.gradle. Auto-register them so extractConstraints - // can document their versions without requiring manual entries for every transitive platform. - // this is required because the micronaut bom format uses gradle modules instead of a pom like spring boot - it.autoRegisterTransitivePlatforms = true - rootProject.subprojects.each { p -> - evaluationDependsOn(p.path) - } - it.projectArtifactIds.set(project.provider { - Map artifactIdMappings = [:] - - rootProject.subprojects.each { p -> - artifactIdMappings[p.name] = p.findProperty('pomArtifactId') ?: p.name - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - artifactIdMappings[dependency.key] = dependency.key - } - - artifactIdMappings - }) - it.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) - it.projectCoordinateProperties.set(project.provider { - Map projectCoordinates = [:] - - rootProject.subprojects.each { p -> - String artifactId = p.findProperty('pomArtifactId') as String ?: p.name - String baseVersionName = artifactId.replaceAll('[.]', '-') - projectCoordinates["${p.group}:${artifactId}:${p.version}" as String] = baseVersionName - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - projectCoordinates["${dependency.value}:${dependency.key}:${project.version}" as String] = dependency.key - } - - projectCoordinates - }) - - it.dependsOn(project.tasks.named('generateMetadataFileForMavenPublication'), project.tasks.named('generatePomFileForMavenPublication')) -} - -def validateNoSnapshotDependencies = tasks.register('validateNoSnapshotDependencies') -validateNoSnapshotDependencies.configure { Task it -> - it.group = 'publishing' - it.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' - - it.doLast { - configurations.each { config -> - config.allDependencies.each { dep -> - if (dep.version && dep.version.contains('-SNAPSHOT')) { - throw new GradleException("Releases cannot have a snapshot dependency: ${dep.group}:${dep.name} (${dep.version})") - } - } - } - } -} - -if (ext.isReleaseBuild && ext.isPublishedExternal) { - project.afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - tasks.named('generatePomFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - } -} - -ext { - pomDescription = 'Grails Hibernate 5 Micronaut BOM (Bill of Materials) for Grails projects integrating with Micronaut and Hibernate 5. Layers Hibernate 5 dependency management on top of grails-micronaut-bom; consume as enforcedPlatform.' - pomCustomization = { xml -> - def root = xml.asNode() - - def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') - - def depMgmt = root.dependencyManagement?.getAt(0) - def deps = depMgmt?.dependencies?.getAt(0) - if (deps) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') - propertyNameCalculator.addProjects(rootProject.subprojects) - for (String gradleArtifactId : project.ext.gradleBuildProjects) { - propertyNameCalculator.addProject('org.apache.grails.gradle', gradleArtifactId, project.version as String, gradleArtifactId) - } - - Map pomProperties = [:] - deps.dependency.each { dep -> - String groupId = dep.groupId.text().trim() - String artifactId = dep.artifactId.text().trim() - boolean isBom = dep.scope.text().trim() == 'import' - - String inlineVersion = dep.version.text().trim() - if (inlineVersion == 'null') { - inlineVersion = null - } - - if (inlineVersion) { - 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 - // overridden by the spring boot dependency management plugin - dep.version[0].value = extractedConstraint.versionPropertyReference - - // Add an entry in the node with the actual version number - pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) - } - } else if (!inlineVersion) { - throw new GradleException("Dependency $groupId:$artifactId does not have a version.") - } - } - - for (Map.Entry property : pomProperties.entrySet()) { - propertiesNode.appendNode(property.key, property.value) - } - } - } -} +ext.pomDescription = 'Grails Hibernate 5 Micronaut BOM (Bill of Materials) for Grails projects integrating with Micronaut and Hibernate 5. Layers Hibernate 5 dependency management on top of grails-micronaut-bom; consume as enforcedPlatform.' diff --git a/grails-bom/hibernate5/build.gradle b/grails-bom/hibernate5/build.gradle index 5c417e45740..e0ff502ac91 100644 --- a/grails-bom/hibernate5/build.gradle +++ b/grails-bom/hibernate5/build.gradle @@ -17,37 +17,8 @@ * under the License. */ -import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask -import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint -import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator - -buildscript { - apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') -} - plugins { - id 'java-platform' - id 'org.apache.grails.buildsrc.publish' - id 'org.apache.grails.buildsrc.sbom' -} - -version = projectVersion -group = 'org.apache.grails' - -javaPlatform { - allowDependencies() -} - -ext { - isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' - isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') - // TODO: It should be possible to pull these build names using includedBuild, but I haven't found a way to do so - gradleBuildProjects = [ - 'grails-gradle-plugins':'org.apache.grails', - 'grails-gradle-model':'org.apache.grails.gradle', - 'grails-gradle-common':'org.apache.grails.gradle', - 'grails-gradle-tasks':'org.apache.grails', - ] + id 'org.apache.grails.buildsrc.bom-conventions' } dependencies { @@ -85,130 +56,4 @@ dependencies { } } -configurations.register('bomDependencies').configure { - it.canBeResolved = true - it.transitive = true - it.extendsFrom(configurations.named('api').get()) -} - -tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it -> - it.captureProjectServices(project.dependencies, project.configurations) - it.configuration = configurations.named('bomDependencies') - it.configurationName = 'bomDependencies' - it.destination = project.layout.buildDirectory.file('grails-hibernate5-bom-constraints.adoc') - it.platformDefinitions = combinedPlatforms - it.definitions = combinedDependencies - it.projectName = project.name - it.versions = combinedVersions - rootProject.subprojects.each { p -> - evaluationDependsOn(p.path) - } - it.projectArtifactIds.set(project.provider { - Map artifactIdMappings = [:] - - rootProject.subprojects.each { p -> - artifactIdMappings[p.name] = p.findProperty('pomArtifactId') ?: p.name - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - artifactIdMappings[dependency.key] = dependency.key - } - - artifactIdMappings - }) - it.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) - it.projectCoordinateProperties.set(project.provider { - Map projectCoordinates = [:] - - rootProject.subprojects.each { p -> - String artifactId = p.findProperty('pomArtifactId') as String ?: p.name - String baseVersionName = artifactId.replaceAll('[.]', '-') - projectCoordinates["${p.group}:${ artifactId}:${p.version}" as String] = baseVersionName - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - projectCoordinates["${dependency.value}:${dependency.key}:${project.version}" as String] = dependency.key - } - - projectCoordinates - }) - - it.dependsOn(project.tasks.named('generateMetadataFileForMavenPublication'), project.tasks.named('generatePomFileForMavenPublication')) -} - -def validateNoSnapshotDependencies = tasks.register('validateNoSnapshotDependencies') -validateNoSnapshotDependencies.configure { Task it -> - it.group = 'publishing' - it.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' - - it.doLast { - configurations.each { config -> - config.allDependencies.each { dep -> - if (dep.version && dep.version.contains('-SNAPSHOT')) { - throw new GradleException("Releases cannot have a snapshot dependency: ${dep.group}:${dep.name} (${dep.version})") - } - } - } - } -} - -if (ext.isReleaseBuild && ext.isPublishedExternal) { - project.afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - tasks.named('generatePomFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - } -} - -ext { - pomDescription = 'Grails Hibernate 5 BOM (Bill of Materials) for managing dependency versions used by Grails Projects with Hibernate 5' - pomCustomization = { xml -> - def root = xml.asNode() - - def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') - - def depMgmt = root.dependencyManagement?.getAt(0) - def deps = depMgmt?.dependencies?.getAt(0) - if (deps) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') - propertyNameCalculator.addProjects(rootProject.subprojects) - for (String gradleArtifactId : project.ext.gradleBuildProjects) { - propertyNameCalculator.addProject('org.apache.grails.gradle', gradleArtifactId, project.version as String, gradleArtifactId) - } - - Map pomProperties = [:] - deps.dependency.each { dep -> - String groupId = dep.groupId.text().trim() - String artifactId = dep.artifactId.text().trim() - boolean isBom = dep.scope.text().trim() == 'import' - - String inlineVersion = dep.version.text().trim() - if (inlineVersion == 'null') { - inlineVersion = null - } - - if (inlineVersion) { - 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 - // overriden by the spring boot dependency management plugin - dep.version[0].value = extractedConstraint.versionPropertyReference - - // Add an entry in the node with the actual version number - pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) - } - } else if (!inlineVersion) { - throw new GradleException("Dependency $groupId:$artifactId does not have a version.") - } - } - - for (Map.Entry property : pomProperties.entrySet()) { - propertiesNode.appendNode(property.key, property.value) - } - } - } -} +ext.pomDescription = 'Grails Hibernate 5 BOM (Bill of Materials) for managing dependency versions used by Grails Projects with Hibernate 5' diff --git a/grails-bom/hibernate7-micronaut/build.gradle b/grails-bom/hibernate7-micronaut/build.gradle index e7702603aaa..b169bc88c48 100644 --- a/grails-bom/hibernate7-micronaut/build.gradle +++ b/grails-bom/hibernate7-micronaut/build.gradle @@ -17,37 +17,8 @@ * under the License. */ -import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask -import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint -import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator - -buildscript { - apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') -} - plugins { - id 'java-platform' - id 'org.apache.grails.buildsrc.publish' - id 'org.apache.grails.buildsrc.sbom' -} - -version = projectVersion -group = 'org.apache.grails' - -javaPlatform { - allowDependencies() -} - -ext { - isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' - isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') - // TODO: It should be possible to pull these build names using includedBuild, but I haven't found a way to do so - gradleBuildProjects = [ - 'grails-gradle-plugins':'org.apache.grails', - 'grails-gradle-model':'org.apache.grails.gradle', - 'grails-gradle-common':'org.apache.grails.gradle', - 'grails-gradle-tasks':'org.apache.grails', - ] + id 'org.apache.grails.buildsrc.bom-conventions' } // Register the Micronaut platform in combinedPlatforms/combinedVersions so @@ -126,135 +97,4 @@ dependencies { } } -configurations.register('bomDependencies').configure { - it.canBeResolved = true - it.transitive = true - it.extendsFrom(configurations.named('api').get()) -} - -tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it -> - it.captureProjectServices(project.dependencies, project.configurations) - it.configuration = configurations.named('bomDependencies') - it.configurationName = 'bomDependencies' - it.destination = project.layout.buildDirectory.file('grails-hibernate7-micronaut-bom-constraints.adoc') - it.platformDefinitions = combinedPlatforms - it.definitions = combinedDependencies - it.projectName = project.name - it.versions = combinedVersions - // Micronaut's platform imports many sub-BOMs (micronaut-*-bom, netty-bom, etc.) that are - // not explicitly registered in dependencies.gradle. Auto-register them so extractConstraints - // can document their versions without requiring manual entries for every transitive platform. - // this is required because the micronaut bom format uses gradle modules instead of a pom like spring boot - it.autoRegisterTransitivePlatforms = true - rootProject.subprojects.each { p -> - evaluationDependsOn(p.path) - } - it.projectArtifactIds.set(project.provider { - Map artifactIdMappings = [:] - - rootProject.subprojects.each { p -> - artifactIdMappings[p.name] = p.findProperty('pomArtifactId') ?: p.name - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - artifactIdMappings[dependency.key] = dependency.key - } - - artifactIdMappings - }) - it.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) - it.projectCoordinateProperties.set(project.provider { - Map projectCoordinates = [:] - - rootProject.subprojects.each { p -> - String artifactId = p.findProperty('pomArtifactId') as String ?: p.name - String baseVersionName = artifactId.replaceAll('[.]', '-') - projectCoordinates["${p.group}:${artifactId}:${p.version}" as String] = baseVersionName - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - projectCoordinates["${dependency.value}:${dependency.key}:${project.version}" as String] = dependency.key - } - - projectCoordinates - }) - - it.dependsOn(project.tasks.named('generateMetadataFileForMavenPublication'), project.tasks.named('generatePomFileForMavenPublication')) -} - -def validateNoSnapshotDependencies = tasks.register('validateNoSnapshotDependencies') -validateNoSnapshotDependencies.configure { Task it -> - it.group = 'publishing' - it.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' - - it.doLast { - configurations.each { config -> - config.allDependencies.each { dep -> - if (dep.version && dep.version.contains('-SNAPSHOT')) { - throw new GradleException("Releases cannot have a snapshot dependency: ${dep.group}:${dep.name} (${dep.version})") - } - } - } - } -} - -if (ext.isReleaseBuild && ext.isPublishedExternal) { - project.afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - tasks.named('generatePomFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - } -} - -ext { - pomDescription = 'Grails Hibernate 7 Micronaut BOM (Bill of Materials) for Grails projects integrating with Micronaut and Hibernate 7. Layers Hibernate 7 dependency management on top of grails-base-bom with Micronaut platform; consume as enforcedPlatform.' - pomCustomization = { xml -> - def root = xml.asNode() - - def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') - - def depMgmt = root.dependencyManagement?.getAt(0) - def deps = depMgmt?.dependencies?.getAt(0) - if (deps) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') - propertyNameCalculator.addProjects(rootProject.subprojects) - for (String gradleArtifactId : project.ext.gradleBuildProjects) { - propertyNameCalculator.addProject('org.apache.grails.gradle', gradleArtifactId, project.version as String, gradleArtifactId) - } - - Map pomProperties = [:] - deps.dependency.each { dep -> - String groupId = dep.groupId.text().trim() - String artifactId = dep.artifactId.text().trim() - boolean isBom = dep.scope.text().trim() == 'import' - - String inlineVersion = dep.version.text().trim() - if (inlineVersion == 'null') { - inlineVersion = null - } - - if (inlineVersion) { - 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 - // overridden by the spring boot dependency management plugin - dep.version[0].value = extractedConstraint.versionPropertyReference - - // Add an entry in the node with the actual version number - pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) - } - } else if (!inlineVersion) { - throw new GradleException("Dependency $groupId:$artifactId does not have a version.") - } - } - - for (Map.Entry property : pomProperties.entrySet()) { - propertiesNode.appendNode(property.key, property.value) - } - } - } -} +ext.pomDescription = 'Grails Hibernate 7 Micronaut BOM (Bill of Materials) for Grails projects integrating with Micronaut and Hibernate 7. Layers Hibernate 7 dependency management on top of grails-base-bom with Micronaut platform; consume as enforcedPlatform.' diff --git a/grails-bom/hibernate7/build.gradle b/grails-bom/hibernate7/build.gradle index 81c5f6c00c1..686dfc30eb6 100644 --- a/grails-bom/hibernate7/build.gradle +++ b/grails-bom/hibernate7/build.gradle @@ -17,37 +17,8 @@ * under the License. */ -import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask -import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint -import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator - -buildscript { - apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') -} - plugins { - id 'java-platform' - id 'org.apache.grails.buildsrc.publish' - id 'org.apache.grails.buildsrc.sbom' -} - -version = projectVersion -group = 'org.apache.grails' - -javaPlatform { - allowDependencies() -} - -ext { - isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' - isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') - // TODO: It should be possible to pull these build names using includedBuild, but I haven't found a way to do so - gradleBuildProjects = [ - 'grails-gradle-plugins':'org.apache.grails', - 'grails-gradle-model':'org.apache.grails.gradle', - 'grails-gradle-common':'org.apache.grails.gradle', - 'grails-gradle-tasks':'org.apache.grails', - ] + id 'org.apache.grails.buildsrc.bom-conventions' } dependencies { @@ -81,130 +52,4 @@ dependencies { } } -configurations.register('bomDependencies').configure { - it.canBeResolved = true - it.transitive = true - it.extendsFrom(configurations.named('api').get()) -} - -tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it -> - it.captureProjectServices(project.dependencies, project.configurations) - it.configuration = configurations.named('bomDependencies') - it.configurationName = 'bomDependencies' - it.destination = project.layout.buildDirectory.file('grails-hibernate7-bom-constraints.adoc') - it.platformDefinitions = combinedPlatforms - it.definitions = combinedDependencies - it.projectName = project.name - it.versions = combinedVersions - rootProject.subprojects.each { p -> - evaluationDependsOn(p.path) - } - it.projectArtifactIds.set(project.provider { - Map artifactIdMappings = [:] - - rootProject.subprojects.each { p -> - artifactIdMappings[p.name] = p.findProperty('pomArtifactId') ?: p.name - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - artifactIdMappings[dependency.key] = dependency.key - } - - artifactIdMappings - }) - it.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) - it.projectCoordinateProperties.set(project.provider { - Map projectCoordinates = [:] - - rootProject.subprojects.each { p -> - String artifactId = p.findProperty('pomArtifactId') as String ?: p.name - String baseVersionName = artifactId.replaceAll('[.]', '-') - projectCoordinates["${p.group}:${ artifactId}:${p.version}" as String] = baseVersionName - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - projectCoordinates["${dependency.value}:${dependency.key}:${project.version}" as String] = dependency.key - } - - projectCoordinates - }) - - it.dependsOn(project.tasks.named('generateMetadataFileForMavenPublication'), project.tasks.named('generatePomFileForMavenPublication')) -} - -def validateNoSnapshotDependencies = tasks.register('validateNoSnapshotDependencies') -validateNoSnapshotDependencies.configure { Task it -> - it.group = 'publishing' - it.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' - - it.doLast { - configurations.each { config -> - config.allDependencies.each { dep -> - if (dep.version && dep.version.contains('-SNAPSHOT')) { - throw new GradleException("Releases cannot have a snapshot dependency: ${dep.group}:${dep.name} (${dep.version})") - } - } - } - } -} - -if (ext.isReleaseBuild && ext.isPublishedExternal) { - project.afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - tasks.named('generatePomFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - } -} - -ext { - pomDescription = 'Grails Hibernate 7 BOM (Bill of Materials) for managing dependency versions used by Grails Projects with Hibernate 7' - pomCustomization = { xml -> - def root = xml.asNode() - - def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') - - def depMgmt = root.dependencyManagement?.getAt(0) - def deps = depMgmt?.dependencies?.getAt(0) - if (deps) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') - propertyNameCalculator.addProjects(rootProject.subprojects) - for (String gradleArtifactId : project.ext.gradleBuildProjects) { - propertyNameCalculator.addProject('org.apache.grails.gradle', gradleArtifactId, project.version as String, gradleArtifactId) - } - - Map pomProperties = [:] - deps.dependency.each { dep -> - String groupId = dep.groupId.text().trim() - String artifactId = dep.artifactId.text().trim() - boolean isBom = dep.scope.text().trim() == 'import' - - String inlineVersion = dep.version.text().trim() - if (inlineVersion == 'null') { - inlineVersion = null - } - - if (inlineVersion) { - 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 - // overriden by the spring boot dependency management plugin - dep.version[0].value = extractedConstraint.versionPropertyReference - - // Add an entry in the node with the actual version number - pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) - } - } else if (!inlineVersion) { - throw new GradleException("Dependency $groupId:$artifactId does not have a version.") - } - } - - for (Map.Entry property : pomProperties.entrySet()) { - propertiesNode.appendNode(property.key, property.value) - } - } - } -} +ext.pomDescription = 'Grails Hibernate 7 BOM (Bill of Materials) for managing dependency versions used by Grails Projects with Hibernate 7' diff --git a/grails-bom/micronaut/build.gradle b/grails-bom/micronaut/build.gradle index f3eda80c75e..0e8a1bc4101 100644 --- a/grails-bom/micronaut/build.gradle +++ b/grails-bom/micronaut/build.gradle @@ -17,37 +17,8 @@ * under the License. */ -import org.apache.grails.gradle.tasks.bom.ExtractDependenciesTask -import org.apache.grails.gradle.tasks.bom.ExtractedDependencyConstraint -import org.apache.grails.gradle.tasks.bom.PropertyNameCalculator - -buildscript { - apply from: rootProject.layout.projectDirectory.file('dependencies.gradle') -} - plugins { - id 'java-platform' - id 'org.apache.grails.buildsrc.publish' - id 'org.apache.grails.buildsrc.sbom' -} - -version = projectVersion -group = 'org.apache.grails' - -javaPlatform { - allowDependencies() -} - -ext { - isReleaseBuild = System.getenv('GRAILS_PUBLISH_RELEASE') == 'true' - isPublishedExternal = System.getenv().containsKey('NEXUS_PUBLISH_STAGING_PROFILE_ID') - // TODO: It should be possible to pull these build names using includedBuild, but I haven't found a way to do so - gradleBuildProjects = [ - 'grails-gradle-plugins':'org.apache.grails', - 'grails-gradle-model':'org.apache.grails.gradle', - 'grails-gradle-common':'org.apache.grails.gradle', - 'grails-gradle-tasks':'org.apache.grails', - ] + id 'org.apache.grails.buildsrc.bom-conventions' } // Register the Micronaut platform in combinedPlatforms/combinedVersions so @@ -127,135 +98,4 @@ dependencies { } } -configurations.register('bomDependencies').configure { - it.canBeResolved = true - it.transitive = true - it.extendsFrom(configurations.named('api').get()) -} - -tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it -> - it.captureProjectServices(project.dependencies, project.configurations) - it.configuration = configurations.named('bomDependencies') - it.configurationName = 'bomDependencies' - it.destination = project.layout.buildDirectory.file('grails-micronaut-bom-constraints.adoc') - it.platformDefinitions = combinedPlatforms - it.definitions = combinedDependencies - it.projectName = project.name - it.versions = combinedVersions - // Micronaut's platform imports many sub-BOMs (micronaut-*-bom, netty-bom, etc.) that are - // not explicitly registered in dependencies.gradle. Auto-register them so extractConstraints - // can document their versions without requiring manual entries for every transitive platform. - // this is required because the micronaut bom format uses gradle modules instead of a pom like spring boot - it.autoRegisterTransitivePlatforms = true - rootProject.subprojects.each { p -> - evaluationDependsOn(p.path) - } - it.projectArtifactIds.set(project.provider { - Map artifactIdMappings = [:] - - rootProject.subprojects.each { p -> - artifactIdMappings[p.name] = p.findProperty('pomArtifactId') ?: p.name - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - artifactIdMappings[dependency.key] = dependency.key - } - - artifactIdMappings - }) - it.forcedGroupPrefixes.set(['org.apache.grails.profiles': 'grails-profile']) - it.projectCoordinateProperties.set(project.provider { - Map projectCoordinates = [:] - - rootProject.subprojects.each { p -> - String artifactId = p.findProperty('pomArtifactId') as String ?: p.name - String baseVersionName = artifactId.replaceAll('[.]', '-') - projectCoordinates["${p.group}:${ artifactId}:${p.version}" as String] = baseVersionName - } - - for (Map.Entry dependency : project.ext.gradleBuildProjects.entrySet()) { - projectCoordinates["${dependency.value}:${dependency.key}:${project.version}" as String] = dependency.key - } - - projectCoordinates - }) - - it.dependsOn(project.tasks.named('generateMetadataFileForMavenPublication'), project.tasks.named('generatePomFileForMavenPublication')) -} - -def validateNoSnapshotDependencies = tasks.register('validateNoSnapshotDependencies') -validateNoSnapshotDependencies.configure { Task it -> - it.group = 'publishing' - it.description = 'Validates that no snapshot dependencies are present in the project when performing a release.' - - it.doLast { - configurations.each { config -> - config.allDependencies.each { dep -> - if (dep.version && dep.version.contains('-SNAPSHOT')) { - throw new GradleException("Releases cannot have a snapshot dependency: ${dep.group}:${dep.name} (${dep.version})") - } - } - } - } -} - -if (ext.isReleaseBuild && ext.isPublishedExternal) { - project.afterEvaluate { - tasks.named('generateMetadataFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - tasks.named('generatePomFileForMavenPublication').configure { - dependsOn(validateNoSnapshotDependencies) - } - } -} - -ext { - pomDescription = 'Grails Micronaut BOM (Bill of Materials) for Grails projects integrating with Micronaut. Layers Micronaut-specific dependency overrides on top of grails-bom; consume as enforcedPlatform.' - pomCustomization = { xml -> - def root = xml.asNode() - - def propertiesNode = root.properties ? root.properties[0] : root.appendNode('properties') - - def depMgmt = root.dependencyManagement?.getAt(0) - def deps = depMgmt?.dependencies?.getAt(0) - if (deps) { - PropertyNameCalculator propertyNameCalculator = new PropertyNameCalculator(combinedPlatforms, combinedDependencies, combinedVersions) - propertyNameCalculator.addForcedGroupPrefix('org.apache.grails.profiles', 'grails-profile') - propertyNameCalculator.addProjects(rootProject.subprojects) - for (String gradleArtifactId : project.ext.gradleBuildProjects) { - propertyNameCalculator.addProject('org.apache.grails.gradle', gradleArtifactId, project.version as String, gradleArtifactId) - } - - Map pomProperties = [:] - deps.dependency.each { dep -> - String groupId = dep.groupId.text().trim() - String artifactId = dep.artifactId.text().trim() - boolean isBom = dep.scope.text().trim() == 'import' - - String inlineVersion = dep.version.text().trim() - if (inlineVersion == 'null') { - inlineVersion = null - } - - if (inlineVersion) { - 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 - // overriden by the spring boot dependency management plugin - dep.version[0].value = extractedConstraint.versionPropertyReference - - // Add an entry in the node with the actual version number - pomProperties.put(extractedConstraint.versionPropertyName, inlineVersion) - } - } else if (!inlineVersion) { - throw new GradleException("Dependency $groupId:$artifactId does not have a version.") - } - } - - for (Map.Entry property : pomProperties.entrySet()) { - propertiesNode.appendNode(property.key, property.value) - } - } - } -} +ext.pomDescription = 'Grails Micronaut BOM (Bill of Materials) for Grails projects integrating with Micronaut. Layers Micronaut-specific dependency overrides on top of grails-bom; consume as enforcedPlatform.'