This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY-11571 in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 518f7ab3140d202a202e5684b0a9b1fdff69a8e7 Author: Eric Milles <[email protected]> AuthorDate: Tue Feb 25 16:38:03 2025 -0600 remove excess manifest attributes * Bundle-ClassPath * DynamicImport-Package * Eclipse-BuddyPolicy * Eclipse-ExtensibleAPI * Extension-Name --- .../src/main/groovy/org.apache.groovy-base.gradle | 69 +++++++++++----------- .../src/main/groovy/org.apache.groovy-core.gradle | 12 ++-- .../main/groovy/org.apache.groovy-library.gradle | 23 ++++---- .../groovy/gradle/GroovyLibraryExtension.groovy | 54 +++++++++-------- .../org/apache/groovy/gradle/JarJarTask.groovy | 17 ++---- 5 files changed, 82 insertions(+), 93 deletions(-) diff --git a/build-logic/src/main/groovy/org.apache.groovy-base.gradle b/build-logic/src/main/groovy/org.apache.groovy-base.gradle index 687c461d93..8be3e653d8 100644 --- a/build-logic/src/main/groovy/org.apache.groovy-base.gradle +++ b/build-logic/src/main/groovy/org.apache.groovy-base.gradle @@ -47,16 +47,16 @@ if (sharedConfiguration.hasCodeCoverage.get()) { pluginManager.apply(JacocoPlugin) } -def groovyLibrary = project.extensions.create("groovyLibrary", GroovyLibraryExtension, sharedConfiguration, java) +def groovyLibrary = project.extensions.create('groovyLibrary', GroovyLibraryExtension, sharedConfiguration, java) java { withSourcesJar() withJavadocJar() } -def generateReleaseInfo = tasks.register("generateReleaseInfo", ReleaseInfoGenerator) +def generateReleaseInfo = tasks.register('generateReleaseInfo', ReleaseInfoGenerator) -def groovydocJar = tasks.register("groovydocJar", Jar) { +def groovydocJar = tasks.register('groovydocJar', Jar) { from groovydoc archiveClassifier = 'groovydoc' group = 'build' @@ -70,7 +70,7 @@ configurations { attributes { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.DOCUMENTATION)) attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL)) - attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType, "groovydoc")) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType, 'groovydoc')) attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME)) } outgoing { @@ -86,7 +86,7 @@ configurations { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.DOCUMENTATION)) attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL)) attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType, DocsType.SOURCES)) - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, "aggregation")) + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, 'aggregation')) } outgoing { sourceSets.main.java.srcDirs.each { @@ -104,7 +104,7 @@ configurations { attributes { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY)) attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL)) - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, "javadocClasspath")) + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, 'javadocClasspath')) } outgoing { artifact tasks.named('jar') @@ -112,12 +112,12 @@ configurations { } codenarc { resolutionStrategy.dependencySubstitution { - substitute module("org.codehaus.groovy:groovy") using project(":") - substitute module("org.codehaus.groovy:groovy-ant") using project(":groovy-ant") - substitute module("org.codehaus.groovy:groovy-templates") using project(":groovy-templates") - substitute module("org.codehaus.groovy:groovy-xml") using project(":groovy-xml") - substitute module("org.codehaus.groovy:groovy-json") using project(":groovy-json") - substitute module("org.codehaus.groovy:groovy-groovydoc") using project(":groovy-groovydoc") + substitute module('org.codehaus.groovy:groovy') using project(':') + substitute module('org.codehaus.groovy:groovy-ant') using project(':groovy-ant') + substitute module('org.codehaus.groovy:groovy-xml') using project(':groovy-xml') + substitute module('org.codehaus.groovy:groovy-json') using project(':groovy-json') + substitute module('org.codehaus.groovy:groovy-groovydoc') using project(':groovy-groovydoc') + substitute module('org.codehaus.groovy:groovy-templates') using project(':groovy-templates') } exclude module: 'groovy-all' @@ -128,7 +128,7 @@ dependencies { compileOnly providers.provider { "com.github.spotbugs:spotbugs-annotations:${versions.spotbugs}" } codenarc "org.codenarc:CodeNarc:${versions.codenarc}" - codenarc project(":groovy-templates") + codenarc project(':groovy-templates') checkstyle "com.puppycrawl.tools:checkstyle:${versions.checkstyle}" spotbugs "com.github.spotbugs:spotbugs:${versions.spotbugs}" @@ -138,15 +138,16 @@ dependencies { } def excludedFromManifest = [ - 'Ant-Version', - 'Originally-Created-By', - 'Bnd-LastModified', - 'Created-By' + 'Ant-Version', + 'Bnd-LastModified', + 'Created-By', + 'Originally-Created-By', + 'Tool' ] tasks.named('jar') { archiveAppendix = 'raw' - archiveClassifier.set("raw") + archiveClassifier.set('raw') groovyLibrary.configureManifest(manifest, excludedFromManifest) } @@ -155,7 +156,7 @@ tasks.withType(AbstractArchiveTask).configureEach { reproducibleFileOrder = true } -tasks.withType(Jar).configureEach {jar -> +tasks.withType(Jar).configureEach { jar -> metaInf { if (jar.name == 'sourcesJar') { if (file("${projectDir}/LICENSE").exists()) { @@ -177,7 +178,7 @@ tasks.withType(Jar).configureEach {jar -> } } -tasks.register("jarjar", JarJarTask) { +tasks.register('jarjar', JarJarTask) { from = jar.archiveFile repackagedLibraries.from configurations.runtimeClasspath.incoming.artifactView { componentFilter { component -> @@ -208,9 +209,9 @@ tasks.register("jarjar", JarJarTask) { outputFile = tasks.named('jar').flatMap { layout.buildDirectory.file("libs/${it.archiveBaseName.get()}-${it.archiveVersion.get()}${(it.archiveClassifier.get() && it.archiveClassifier.get() != 'raw') ? '-' + it.archiveClassifier.get() : ''}.jar") } withManifest { - def extras = project.name == 'groovy' ? ['Main-Class': 'groovy.ui.GroovyMain'] : [:] - def moduleName = "org.apache.${project.name.replace('-', '.')}" - attributes('Automatic-Module-Name': moduleName, 'Bundle-Name': 'Groovy module: ' + project.name, *:extras) + String projectName = project.name + String autoModName = "org.apache.${projectName.replace('-','.')}" + attributes('Automatic-Module-Name': autoModName, 'Bundle-Name': "Groovy module: $projectName") groovyLibrary.configureManifest(it, excludedFromManifest) classpath = configurations.runtimeClasspath } @@ -225,17 +226,17 @@ tasks.withType(Javadoc).configureEach { options.source = sharedConfiguration.targetJavaVersion.get() } -tasks.named("compileTestGroovy") { - options.forkOptions.jvmArgs += ["-Dspock.iKnowWhatImDoing.disableGroovyVersionCheck=true"] +tasks.named('compileTestGroovy') { + options.forkOptions.jvmArgs += ['-Dspock.iKnowWhatImDoing.disableGroovyVersionCheck=true'] } tasks.withType(CodeNarc).configureEach { ignoreFailures = true - configFile = rootProject.file("config/codenarc/codenarc.groovy") + configFile = rootProject.file('config/codenarc/codenarc.groovy') } tasks.withType(SpotBugsTask).configureEach { - excludeFilter = rootProject.file("config/spotbugs/exclude.xml") + excludeFilter = rootProject.file('config/spotbugs/exclude.xml') ignoreFailures = true effort = Effort.valueOf('MAX') maxHeapSize = '2g' @@ -250,14 +251,14 @@ tasks.withType(SpotBugsTask).configureEach { } } -tasks.register("checkstyle") { +tasks.register('checkstyle') { dependsOn tasks.withType(Checkstyle) } tasks.withType(Checkstyle).configureEach {chk -> showViolations = false ignoreFailures = true - configFile = rootProject.file("config/checkstyle/checkstyle.xml") + configFile = rootProject.file('config/checkstyle/checkstyle.xml') configProperties = ['rootProject.projectDir': rootProject.projectDir] def reportFile = layout.buildDirectory.file("reports/checkstyle/${name}.xml") reports { @@ -271,7 +272,7 @@ tasks.withType(Checkstyle).configureEach {chk -> tasks.register("${name}Report", CheckstyleHtmlReport) { dependsOn chk source.from(chk.source) - configFile = rootProject.file("config/checkstyle/checkstyle-report.groovy") + configFile = rootProject.file('config/checkstyle/checkstyle-report.groovy') checkstyleReportFile = reportFile outputFile = layout.buildDirectory.file("reports/checkstyle/${chk.name}.html") } @@ -280,8 +281,8 @@ tasks.withType(Checkstyle).configureEach {chk -> // remove below if checkstyle fix up their dependency metadata to no longer have conflicts configurations.checkstyle { - resolutionStrategy.capabilitiesResolution.withCapability("com.google.collections:google-collections") { - select("com.google.guava:guava:0") + resolutionStrategy.capabilitiesResolution.withCapability('com.google.collections:google-collections') { + select('com.google.guava:guava:0') } } @@ -317,8 +318,8 @@ def shadowRuntime = createConsumableConfiguration(objects, tasks, configurations dependencies { // All Groovy modules depend on the Groovy BOM which itself has constraints on all // Groovy modules, which brings nice alignment features! - groovyApiElements platform(project(":groovy-bom")) - groovyRuntimeElements platform(project(":groovy-bom")) + groovyApiElements platform(project(':groovy-bom')) + groovyRuntimeElements platform(project(':groovy-bom')) } component.addVariantsFromConfiguration(shadowApi) { diff --git a/build-logic/src/main/groovy/org.apache.groovy-core.gradle b/build-logic/src/main/groovy/org.apache.groovy-core.gradle index a669c72e95..c647fafabb 100644 --- a/build-logic/src/main/groovy/org.apache.groovy-core.gradle +++ b/build-logic/src/main/groovy/org.apache.groovy-core.gradle @@ -104,7 +104,7 @@ sourceSets { } } -def dgmConverter = tasks.register("dgmConverter", DgmConverter) { +def dgmConverter = tasks.register('dgmConverter', DgmConverter) { classpath.from files(compileJava, configurations.compileClasspath) sources.from('src/main').include('**/*GroovyMethods.java') } @@ -117,24 +117,22 @@ tasks.named('jar') { from dgmConverter } -tasks.named('jarjar') { JarJarTask it -> +tasks.named('jarjar') { JarJarTask jjt -> def groovyBundleVersion = sharedConfiguration.groovyBundleVersion.get() - it.withManifest { - version = groovyBundleVersion + jjt.withManifest { instruction '-nouses', 'true' instruction 'Export-Package', "*;version=${groovyBundleVersion}" - instruction 'Eclipse-ExtensibleAPI', 'true' } } // Gradle classloading magic with Groovy will only work if it finds a *jar* // on classpath. This "bootstrap jar" contains the minimal compiler, without .groovy compiled files -def bootstrapJar = tasks.register("bootstrapJar", Jar) { +def bootstrapJar = tasks.register('bootstrapJar', Jar) { from compileJava from dgmConverter - destinationDirectory = layout.buildDirectory.dir("bootstrap") + destinationDirectory = layout.buildDirectory.dir('bootstrap') archiveClassifier = 'bootstrap' } diff --git a/build-logic/src/main/groovy/org.apache.groovy-library.gradle b/build-logic/src/main/groovy/org.apache.groovy-library.gradle index 44ee89f65a..ab2144e1b2 100644 --- a/build-logic/src/main/groovy/org.apache.groovy-library.gradle +++ b/build-logic/src/main/groovy/org.apache.groovy-library.gradle @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ + import org.apache.groovy.gradle.JarJarTask plugins { @@ -29,23 +30,19 @@ dependencies { testImplementation testFixtures(project(":")) } -tasks.named('jarjar') { JarJarTask it -> +tasks.named('jarjar') { JarJarTask jjt -> def groovyBundleVersion = sharedConfiguration.groovyBundleVersion.get() - def symbolicName = project.name - it.withManifest { - version = groovyBundleVersion + jjt.withManifest { instruction '-nouses', 'true' instruction 'Export-Package', "*;version=${groovyBundleVersion}" - instruction 'Fragment-Host', 'groovy' + instruction 'Fragment-Host', 'groovy' // GROOVY-9402, GROOVY-11570 def folder = file("${projectDir}/src/main/resources/META-INF/services") - if (folder.exists()) { - if (folder.listFiles().count { it.name ==~ /^(?!(org.codehaus.groovy.transform.ASTTransformation)$).*$/ } > 0) { - instruction 'Require-Capability', 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"' - instruction 'Require-Capability', 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)"' - folder.eachFileMatch(~/^(?!(org.codehaus.groovy.transform.ASTTransformation)$).*$/) { - instruction 'Require-Capability', "osgi.serviceloader;filter:=\"(osgi.serviceloader=${it.name})\";cardinality:=multiple" - instruction 'Provide-Capability', "osgi.serviceloader;osgi.serviceloader=\"${it.name}\"" - } + if (folder.exists() && folder.listFiles().count { it.name ==~ /^(?!(org.codehaus.groovy.transform.ASTTransformation)$).*$/ } > 0) { + instruction 'Require-Capability', 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"' + instruction 'Require-Capability', 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)"' + folder.eachFileMatch(~/^(?!(org.codehaus.groovy.transform.ASTTransformation)$).*$/) { + instruction 'Require-Capability', "osgi.serviceloader;filter:=\"(osgi.serviceloader=${it.name})\";cardinality:=multiple" + instruction 'Provide-Capability', "osgi.serviceloader;osgi.serviceloader=\"${it.name}\"" } } } diff --git a/build-logic/src/main/groovy/org/apache/groovy/gradle/GroovyLibraryExtension.groovy b/build-logic/src/main/groovy/org/apache/groovy/gradle/GroovyLibraryExtension.groovy index c306b1a61b..68fc48b589 100644 --- a/build-logic/src/main/groovy/org/apache/groovy/gradle/GroovyLibraryExtension.groovy +++ b/build-logic/src/main/groovy/org/apache/groovy/gradle/GroovyLibraryExtension.groovy @@ -20,6 +20,7 @@ package org.apache.groovy.gradle import groovy.transform.CompileStatic import org.gradle.api.Action +import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurationContainer @@ -60,20 +61,20 @@ class GroovyLibraryExtension { final JavaPluginExtension javaPluginExtension final SoftwareComponentContainer components final ConfigurationContainer configurations - final TaskContainer tasks + private final String projectName final ProjectLayout layout + final TaskContainer tasks @Inject GroovyLibraryExtension(ObjectFactory factory, - ProjectLayout layout, SharedConfiguration sharedConfiguration, JavaPluginExtension javaPluginExtension, SoftwareComponentContainer components, ConfigurationContainer configurations, + Project project, ProjectLayout layout, TaskContainer tasks ) { this.objects = factory - this.layout = layout this.sharedConfiguration = sharedConfiguration this.includeInGroovyAll = factory.property(Boolean).convention(true) this.grooid = factory.property(Boolean).convention(false) @@ -82,6 +83,8 @@ class GroovyLibraryExtension { this.javaPluginExtension = javaPluginExtension this.components = components this.configurations = configurations + this.projectName = project.name + this.layout = layout this.tasks = tasks } @@ -192,7 +195,7 @@ class GroovyLibraryExtension { void configureManifest(Manifest manifest, List<String> exclusions) { manifest.from(createBaseManifest()) { ManifestMergeSpec spec -> spec.eachEntry { ManifestMergeDetails details -> - if (exclusions.any { it == details.key }) { + if (exclusions.contains(details.getKey())) { details.exclude() } } @@ -201,25 +204,24 @@ class GroovyLibraryExtension { private Manifest createBaseManifest() { def groovyBundleVersion = sharedConfiguration.groovyBundleVersion.get() - javaPluginExtension.manifest { Manifest mn -> - mn.attributes( - 'Extension-Name': 'groovy', - 'Specification-Title': 'Groovy: a powerful, multi-faceted language for the JVM', - 'Specification-Version': groovyBundleVersion, - 'Specification-Vendor': 'The Apache Software Foundation', - 'Implementation-Title': 'Groovy: a powerful, multi-faceted language for the JVM', - 'Implementation-Version': groovyBundleVersion, - 'Implementation-Vendor': 'The Apache Software Foundation', - 'Bundle-ManifestVersion': '2', - 'Bundle-Description': 'Groovy Runtime', - 'Bundle-License': 'Apache-2.0', - 'Bundle-Version': groovyBundleVersion, - 'Bundle-Vendor': 'The Apache Software Foundation', - 'Bundle-ClassPath': '.', - 'Eclipse-BuddyPolicy': 'dependent', - 'DynamicImport-Package': '*') + javaPluginExtension.manifest { + attributes( + 'Bundle-ManifestVersion': '2', + 'Bundle-Description' : 'Groovy Runtime', + 'Bundle-Vendor' : 'The Apache Software Foundation', + 'Bundle-Version' : groovyBundleVersion, + 'Bundle-License' : 'Apache-2.0', + 'Specification-Title' : 'Groovy: a powerful, multi-faceted language for the JVM', + 'Specification-Vendor' : 'The Apache Software Foundation', + 'Specification-Version' : groovyBundleVersion, + 'Implementation-Title' : 'Groovy: a powerful, multi-faceted language for the JVM', + 'Implementation-Vendor' : 'The Apache Software Foundation', + 'Implementation-Version': groovyBundleVersion + ) + if (projectName == 'groovy') { + attributes('Main-Class': 'groovy.ui.GroovyMain') + } } - } class ModuleDescriptorSpec { @@ -227,11 +229,11 @@ class GroovyLibraryExtension { String staticExtensionClasses = '' private void build() { - def moduleDescriptor = tasks.register("moduleDescriptor", WriteExtensionDescriptorTask) { - it.extensionClasses = extensionClasses - it.staticExtensionClasses = staticExtensionClasses + def moduleDescriptor = tasks.register('moduleDescriptor', WriteExtensionDescriptorTask) { t -> + t.extensionClasses = extensionClasses + t.staticExtensionClasses = staticExtensionClasses } - tasks.named("processResources") { Task t -> + tasks.named('processResources') { Task t -> t.dependsOn(moduleDescriptor) } } diff --git a/build-logic/src/main/groovy/org/apache/groovy/gradle/JarJarTask.groovy b/build-logic/src/main/groovy/org/apache/groovy/gradle/JarJarTask.groovy index 8f661b3518..1bb7c20ced 100644 --- a/build-logic/src/main/groovy/org/apache/groovy/gradle/JarJarTask.groovy +++ b/build-logic/src/main/groovy/org/apache/groovy/gradle/JarJarTask.groovy @@ -18,7 +18,6 @@ */ package org.apache.groovy.gradle -import groovy.transform.CompileStatic import org.gradle.api.Action import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection @@ -42,7 +41,7 @@ class JarJarTask extends DefaultTask { private final static String JARJAR_CLASS_NAME = 'com.eed3si9n.jarjar.JarJarTask' @Internal - String description = "Repackages dependencies into a shaded jar" + String description = 'Repackages dependencies into a shaded jar' private List<Action<? super Manifest>> manifestTweaks = [] @@ -145,7 +144,7 @@ class JarJarTask extends DefaultTask { } if (createManifest) { - // next step is to generate an OSGI manifest using the newly repackaged classes + // next step is to generate an OSGi manifest using the newly repackaged classes def mf = project.rootProject.extensions.osgi.osgiManifest { symbolicName = project.name instruction 'Import-Package', '*;resolution:=optional' @@ -169,16 +168,9 @@ class JarJarTask extends DefaultTask { it.into(outputFile.parentFile) it.rename { outputFile.name } } - project.ant.jar(destfile: outputFile, update: true, index: true, manifest: manifestFile, modificationtime: tstamp) { - manifest { - // because we don't want to use JDK 1.8.0_91, we don't care and it will - // introduce cache misses - attribute(name: 'Created-By', value: 'Gradle') - } + project.ant.jar(destfile: outputFile, index: true, manifest: manifestFile, modificationtime: tstamp, update: true) { if (untouchedFiles) { - zipfileset( - src: originalJar, - includes: untouchedFiles.join(',')) + zipfileset(src: originalJar, includes: untouchedFiles.join(',')) } } } finally { @@ -188,7 +180,6 @@ class JarJarTask extends DefaultTask { } } - @CompileStatic private static String baseName(File file) { file.name.substring(0, file.name.lastIndexOf('-')) }
