diff --git a/src/it/projects/apache-notice-project-name/pom.xml b/src/it/projects/apache-notice-project-name/pom.xml
new file mode 100644
index 00000000..5affb9ea
--- /dev/null
+++ b/src/it/projects/apache-notice-project-name/pom.xml
@@ -0,0 +1,52 @@
+
+
+
+ 4.0.0
+
+ org.apache.maven.its.shade
+ apache-notice-project-name
+ 1.0
+ Maven Shade Notice Reproducer
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ @project.version@
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/it/projects/apache-notice-project-name/src/main/resources/META-INF/NOTICE b/src/it/projects/apache-notice-project-name/src/main/resources/META-INF/NOTICE
new file mode 100644
index 00000000..c3ac3f0f
--- /dev/null
+++ b/src/it/projects/apache-notice-project-name/src/main/resources/META-INF/NOTICE
@@ -0,0 +1 @@
+Dependency notice
diff --git a/src/it/projects/apache-notice-project-name/verify.groovy b/src/it/projects/apache-notice-project-name/verify.groovy
new file mode 100644
index 00000000..6a25e83c
--- /dev/null
+++ b/src/it/projects/apache-notice-project-name/verify.groovy
@@ -0,0 +1,28 @@
+/*
+ * 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
+ *
+ * http://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.
+ */
+
+import java.util.jar.JarFile
+
+def shadedJar = new JarFile(new File(basedir, "target/apache-notice-project-name-1.0.jar"))
+try {
+ def notice = shadedJar.getInputStream(shadedJar.getJarEntry("META-INF/NOTICE")).getText("UTF-8")
+ assert notice.contains("Version 2.0, in this case for Maven Shade Notice Reproducer")
+} finally {
+ shadedJar.close()
+}
diff --git a/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java b/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java
index 09e3956f..b4494f1b 100644
--- a/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java
+++ b/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java
@@ -60,6 +60,7 @@
import org.apache.maven.plugins.shade.relocation.Relocator;
import org.apache.maven.plugins.shade.relocation.SerializedLambdaRelocator;
import org.apache.maven.plugins.shade.relocation.SimpleRelocator;
+import org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer;
import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer;
import org.apache.maven.plugins.shade.resource.ResourceTransformer;
import org.apache.maven.project.DefaultProjectBuildingRequest;
@@ -971,6 +972,9 @@ private List getResourceTransformers() throws MojoExecution
throw new MojoExecutionException(
"Failed to create shaded artifact: parameter transformers contains null (double-check XML attribute)");
}
+ if (transformer instanceof ApacheNoticeResourceTransformer) {
+ ((ApacheNoticeResourceTransformer) transformer).setProjectNameIfUnset(project.getName());
+ }
}
return Arrays.asList(transformers);
}
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java
index d98ef39d..d47b072f 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java
@@ -79,6 +79,19 @@ public class ApacheNoticeResourceTransformer extends AbstractCompatibilityTransf
private static final String NOTICE_MD_PATH = "META-INF/NOTICE.md";
+ /**
+ * Uses the Maven project name when no project name was configured explicitly.
+ *
+ * @param projectName the Maven project name
+ */
+ public void setProjectNameIfUnset(String projectName) {
+ if (this.projectName.isEmpty()
+ && projectName != null
+ && !projectName.trim().isEmpty()) {
+ this.projectName = projectName;
+ }
+ }
+
@Override
public boolean canTransformResource(String resource) {
return NOTICE_PATH.equalsIgnoreCase(resource)
diff --git a/src/site/markdown/examples/resource-transformers.md.vm b/src/site/markdown/examples/resource-transformers.md.vm
index 2ba2b167..3eed3324 100644
--- a/src/site/markdown/examples/resource-transformers.md.vm
+++ b/src/site/markdown/examples/resource-transformers.md.vm
@@ -442,6 +442,9 @@ For example, the following prevents the license from a `commons-collections` dep
Some licenses (including the [ Apache License, Version 2](https://www.apache.org/licenses/LICENSE-2.0.html)) require that notices are preserved by downstream distributors. `ApacheNoticeResourceTransformer` automates the assembly of an appropriate `NOTICE`.
+The generated notice uses the Maven project name by default. This can be overridden with the
+`projectName` transformer parameter.
+
For example, to simply merge in dependent notices:
```xml
diff --git a/src/test/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformerTest.java b/src/test/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformerTest.java
index f95c8186..bedf58ba 100644
--- a/src/test/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformerTest.java
+++ b/src/test/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformerTest.java
@@ -28,6 +28,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@@ -65,6 +66,25 @@ public void testCanTransformResource() {
assertFalse(transformer.canTransformResource("META-INF/MANIFEST.MF"));
}
+ @Test
+ public void testProjectNameDefaultsToMavenProjectName() {
+ transformer.setProjectNameIfUnset(null);
+ transformer.setProjectNameIfUnset(" ");
+ assertEquals("", transformer.projectName);
+
+ transformer.setProjectNameIfUnset("Maven Project Name");
+ assertEquals("Maven Project Name", transformer.projectName);
+ }
+
+ @Test
+ public void testConfiguredProjectNameTakesPrecedence() {
+ transformer.projectName = "Configured Project Name";
+
+ transformer.setProjectNameIfUnset("Maven Project Name");
+
+ assertEquals("Configured Project Name", transformer.projectName);
+ }
+
@Test
public void testNoParametersShouldNotThrowNullPointerWhenNoInput() throws IOException {
processAndFailOnNullPointer("");