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("");