This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 83e6c6c6fd GROOVY-11582: remove excess manifest attributes (pre-work:
formatting and minor refactoring)
83e6c6c6fd is described below
commit 83e6c6c6fdd73f371b0dbf5aaaf979f03c52b813
Author: Eric Milles <[email protected]>
AuthorDate: Tue Feb 25 16:38:03 2025 -0600
GROOVY-11582: remove excess manifest attributes (pre-work: formatting and
minor refactoring)
---
.../src/main/groovy/org.apache.groovy-base.gradle | 69 +++++-----
.../src/main/groovy/org.apache.groovy-core.gradle | 16 +--
.../main/groovy/org.apache.groovy-library.gradle | 23 ++--
.../groovy/gradle/GroovyLibraryExtension.groovy | 56 ++++----
.../org/apache/groovy/gradle/JarJarTask.groovy | 150 ++++++++++-----------
5 files changed, 149 insertions(+), 165 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..e07408deb4 100644
--- a/build-logic/src/main/groovy/org.apache.groovy-core.gradle
+++ b/build-logic/src/main/groovy/org.apache.groovy-core.gradle
@@ -17,13 +17,10 @@
* under the License.
*/
-
import org.apache.groovy.gradle.CoreExtension
import org.apache.groovy.gradle.DgmConverter
import org.apache.groovy.gradle.JarJarTask
-import javax.inject.Inject
-
plugins {
id 'org.apache.groovy-common'
id 'org.apache.groovy-base'
@@ -104,7 +101,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,10 +114,9 @@ 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'
@@ -130,11 +126,11 @@ tasks.named('jarjar') { JarJarTask it ->
// 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'
}
@@ -155,7 +151,7 @@ allprojects {
}
interface CoreServices {
- @Inject
+ @javax.inject.Inject
ExecOperations getExecOperations()
}
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..12232b12fe 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.processor)"'
+ instruction 'Require-Capability',
'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"'
+
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..acd7be5a44 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,26 @@ 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',
+ 'DynamicImport-Package' : '*',
+ 'Eclipse-BuddyPolicy' : 'dependent',
+ '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 +231,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..4859830934 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,10 @@
*/
package org.apache.groovy.gradle
-import groovy.transform.CompileStatic
+import groovy.transform.AutoFinal
+
+import javax.inject.Inject
+
import org.gradle.api.Action
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
@@ -31,22 +34,15 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
-import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.Optional
+import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
-import javax.inject.Inject
-
-@CacheableTask
+@AutoFinal @CacheableTask
class JarJarTask extends DefaultTask {
- private final static String JARJAR_CLASS_NAME =
'com.eed3si9n.jarjar.JarJarTask'
@Internal
- String description = "Repackages dependencies into a shaded jar"
-
- private List<Action<? super Manifest>> manifestTweaks = []
-
- private final FileSystemOperations fs
+ String description = 'Repackages dependencies into a shaded jar'
@InputFile
@Classpath
@@ -90,13 +86,17 @@ class JarJarTask extends DefaultTask {
@Input
boolean createManifest = true
+ private final FileSystemOperations fs
+
+ private List<Action<? super Manifest>> manifestTweaks = []
+
@Inject
JarJarTask(FileSystemOperations fileSystemOperations) {
this.fs = fileSystemOperations
}
void withManifest(Action<? super Manifest> action) {
- manifestTweaks << action
+ manifestTweaks.add(action)
}
@Internal
@@ -106,89 +106,75 @@ class JarJarTask extends DefaultTask {
@TaskAction
void generateDescriptor() {
- def originalJar = from.get()
- def outputFile = this.outputFile.get().asFile
- def tmpJar = new File(temporaryDir,
"${outputFile.name}.${Integer.toHexString(UUID.randomUUID().hashCode())}.tmp")
- tmpJar.deleteOnExit()
- def manifestFile = new File(temporaryDir, 'MANIFEST.MF')
- // First step is to create a repackaged jar
+ File outputFile = this.outputFile.get().asFile
outputFile.parentFile.mkdirs()
- def tstamp = Date.parse('yyyy-MM-dd HH:mm', '1980-02-01
00:00').time.toString()
- try {
- project.ant {
- taskdef name: 'jarjar', classname: JARJAR_CLASS_NAME,
classpath: jarjarToolClasspath.asPath
- jarjar(jarfile: tmpJar, filesonly: true, modificationtime:
tstamp) {
- zipfileset(
- src: originalJar,
- excludes: (untouchedFiles + excludes).join(','))
- includedResources.each { String resource, String path ->
- String dir = resource.substring(0,
resource.lastIndexOf('/') + 1)
- String filename =
resource.substring(resource.lastIndexOf('/') + 1)
- zipfileset(dir: dir, includes: filename, fullpath:
path)
- }
- repackagedLibraries.files.each { File library ->
- def libraryName = JarJarTask.baseName(library)
- def includes = includesPerLibrary[libraryName]
- def excludes = excludesPerLibrary[libraryName]
- if (includes) {
- zipfileset(src: library, includes:
includes.join(','))
- } else if (excludes) {
- zipfileset(src: library, excludes:
excludes.join(','))
- } else {
- zipfileset(src: library, excludes:
excludesPerLibrary['*'].join(','))
- }
- }
- patterns.each { pattern, result ->
- rule pattern: pattern, result: result
- }
- }
- }
- if (createManifest) {
- // 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'
- classesDir = tmpJar
- }
+ File tmpJar = new File(temporaryDir,
"${archiveName}.${Integer.toHexString(UUID.randomUUID().hashCode())}.tmp")
+ tmpJar.deleteOnExit()
- manifestTweaks.each {
- it.execute(mf)
+ File manifestFile = new File(temporaryDir, 'MANIFEST.MF')
+ manifestFile.deleteOnExit()
+
+ // Use fixed date/timestamp for reproducible build
+ String tstamp = Date.parse('yyyy-MM-dd HH:mm', '1980-02-01
00:00').getTime().toString()
+
+ // Step 1: create a repackaged jar
+ project.ant {
+ taskdef name: 'jarjar', classname:
'com.eed3si9n.jarjar.JarJarTask', classpath: jarjarToolClasspath.asPath
+ jarjar(jarfile: tmpJar, filesonly: true, modificationtime: tstamp)
{
+ zipfileset(src: from.get(), excludes: (untouchedFiles +
excludes).join(','))
+ includedResources.each { String resource, String path ->
+ String dir = resource.substring(0,
resource.lastIndexOf('/') + 1)
+ String filename =
resource.substring(resource.lastIndexOf('/') + 1)
+ zipfileset(dir: dir, includes: filename, fullpath: path)
+ }
+ repackagedLibraries.files.each { File library ->
+ def libraryName = JarJarTask.baseName(library)
+ def includes = includesPerLibrary[libraryName]
+ def excludes = excludesPerLibrary[libraryName]
+ if (includes) {
+ zipfileset(src: library, includes: includes.join(','))
+ } else if (excludes) {
+ zipfileset(src: library, excludes: excludes.join(','))
+ } else {
+ zipfileset(src: library, excludes:
excludesPerLibrary['*'].join(','))
+ }
+ }
+ patterns.each { pattern, result ->
+ rule pattern: pattern, result: result
}
+ }
+ }
- // then we need to generate the manifest file
- mf.writeTo(manifestFile)
+ fs.copy { spec ->
+ spec.from(tmpJar)
+ spec.into(outputFile.parentFile)
+ spec.rename { this.archiveName }
+ }
- } else {
- manifestFile << ''
+ // Step 2: update the archive with a class index and any untouched
files
+ project.ant.jar(destfile: outputFile, index: true, modificationtime:
tstamp, update: true) {
+ if (untouchedFiles) {
+ zipfileset(src: from.get(), includes: untouchedFiles.join(','))
}
+ }
- // so that we can put it into the final jar
- fs.copy {
- it.from(tmpJar)
- it.into(outputFile.parentFile)
- it.rename { outputFile.name }
+ // Step 3: generate an OSGi manifest referencing the repackaged classes
+ if (createManifest) {
+ def mf = project.rootProject.extensions.osgi.osgiManifest {
+ symbolicName = project.name
+ instruction 'Import-Package', '*;resolution:=optional'
+ classesDir = tmpJar
}
- 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')
- }
- if (untouchedFiles) {
- zipfileset(
- src: originalJar,
- includes: untouchedFiles.join(','))
- }
- }
- } finally {
- fs.delete {
- it.delete(manifestFile)
+ manifestTweaks*.execute(mf)
+ mf.writeTo(manifestFile)
+
+ project.ant.zip(destfile: outputFile, modificationtime: tstamp,
update: true) {
+ zipfileset(dir: manifestFile.parent, includes:
manifestFile.name, prefix: 'META-INF')
}
}
}
- @CompileStatic
private static String baseName(File file) {
file.name.substring(0, file.name.lastIndexOf('-'))
}