From 754e00d0ae4672a3612b375d4bb4a57aeaa337b2 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 13 Sep 2022 09:26:42 +0100 Subject: [PATCH] Add Automatic-Module-Name to jar manifest - Basically doing same what framework/boot does for jar manifests. - Copied gradle settings from boot which gives us dot format like Automatic-Module-Name: spring.shell.core - Fixes #529 --- .../shell/gradle/JavaConventions.java | 40 +++++++++++++++++++ .../shell/gradle/StarterPlugin.java | 1 + 2 files changed, 41 insertions(+) diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/JavaConventions.java b/buildSrc/src/main/java/org/springframework/shell/gradle/JavaConventions.java index 2eb59c35..56716cba 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/JavaConventions.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/JavaConventions.java @@ -17,10 +17,17 @@ package org.springframework.shell.gradle; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.stream.Collectors; import org.gradle.api.JavaVersion; import org.gradle.api.Project; import org.gradle.api.plugins.JavaBasePlugin; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; +import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.javadoc.Javadoc; import org.gradle.api.tasks.testing.Test; @@ -38,6 +45,7 @@ class JavaConventions { configureJavaConventions(project); configureJavadocConventions(project); configureTestConventions(project); + configureJarManifestConventions(project); }); } @@ -79,4 +87,36 @@ class JavaConventions { test.useJUnitPlatform(); }); } + + private void configureJarManifestConventions(Project project) { + SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class); + Set sourceJarTaskNames = sourceSets.stream().map(SourceSet::getSourcesJarTaskName) + .collect(Collectors.toSet()); + Set javadocJarTaskNames = sourceSets.stream().map(SourceSet::getJavadocJarTaskName) + .collect(Collectors.toSet()); + + project.getTasks().withType(Jar.class, jar -> { + jar.manifest(manifest -> { + Map attributes = new TreeMap<>(); + attributes.put("Automatic-Module-Name", project.getName().replace("-", ".")); + attributes.put("Build-Jdk-Spec", SOURCE_AND_TARGET_COMPATIBILITY); + attributes.put("Built-By", "Spring"); + attributes.put("Implementation-Title", + determineImplementationTitle(project, sourceJarTaskNames, javadocJarTaskNames, jar)); + attributes.put("Implementation-Version", project.getVersion()); + manifest.attributes(attributes); + }); + }); + } + + private String determineImplementationTitle(Project project, Set sourceJarTaskNames, + Set javadocJarTaskNames, Jar jar) { + if (sourceJarTaskNames.contains(jar.getName())) { + return "Source for " + project.getName(); + } + if (javadocJarTaskNames.contains(jar.getName())) { + return "Javadoc for " + project.getName(); + } + return "Jar for " + project.getName(); + } } diff --git a/buildSrc/src/main/java/org/springframework/shell/gradle/StarterPlugin.java b/buildSrc/src/main/java/org/springframework/shell/gradle/StarterPlugin.java index e0979ddc..cdcd8aa4 100644 --- a/buildSrc/src/main/java/org/springframework/shell/gradle/StarterPlugin.java +++ b/buildSrc/src/main/java/org/springframework/shell/gradle/StarterPlugin.java @@ -35,5 +35,6 @@ class StarterPlugin implements Plugin { pluginManager.apply(SpringMavenPlugin.class); new ArtifactoryConventions().apply(project); + new JavaConventions().apply(project); } }