Skip to content

Commit 347d7d3

Browse files
committed
[MSHARED-773] - Fail on invalid 'Automatic-Module-Name' in MANIFEST
Maven Archiver now fails with a `ManifestException` when an invalid `Automatic-Module-Name` is detected within the `META-INF/MANIFEST.MF` entries. For details see https://sormuras.github.io/blog/2018-11-16-invalid-automatic-module-names https://issues.apache.org/jira/projects/MSHARED/issues/MSHARED-773
1 parent b687d1b commit 347d7d3

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

src/main/java/org/apache/maven/archiver/MavenArchiver.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.codehaus.plexus.interpolation.ValueSource;
3939
import org.apache.maven.shared.utils.StringUtils;
4040

41+
import javax.lang.model.SourceVersion;
4142
import java.io.File;
4243
import java.io.IOException;
4344
import java.util.ArrayList;
@@ -91,6 +92,11 @@ public class MavenArchiver
9192
ARTIFACT_EXPRESSION_PREFIXES = artifactExpressionPrefixes;
9293
}
9394

95+
static boolean isValidModuleName( String name )
96+
{
97+
return SourceVersion.isName( name );
98+
}
99+
94100
private JarArchiver archiver;
95101

96102
private File archiveFile;
@@ -645,6 +651,15 @@ public void createArchive( MavenSession session, MavenProject project,
645651
// "Forced build is disabled, but disabling the forced mode isn't supported by the archiver." );
646652
}
647653

654+
String automaticModuleName = manifest.getMainSection().getAttributeValue( "Automatic-Module-Name" );
655+
if ( automaticModuleName != null )
656+
{
657+
if ( !isValidModuleName( automaticModuleName ) )
658+
{
659+
throw new ManifestException( "Invalid automatic module name: '" + automaticModuleName + "'" );
660+
}
661+
}
662+
648663
// create archive
649664
archiver.createArchive();
650665
}

src/test/java/org/apache/maven/archiver/MavenArchiverTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,30 @@ public boolean equals( Object o )
8282
}
8383
}
8484

85+
@Test
86+
public void testInvalidModuleNames()
87+
{
88+
assertFalse( MavenArchiver.isValidModuleName( "" ) );
89+
assertFalse( MavenArchiver.isValidModuleName( "." ) );
90+
assertFalse( MavenArchiver.isValidModuleName( "dash-is-invalid" ) );
91+
assertFalse( MavenArchiver.isValidModuleName( "plus+is+invalid" ) );
92+
assertFalse( MavenArchiver.isValidModuleName( "colon:is:invalid" ) );
93+
assertFalse( MavenArchiver.isValidModuleName( "new.class" ) );
94+
assertFalse( MavenArchiver.isValidModuleName( "123.at.start.is.invalid" ) );
95+
assertFalse( MavenArchiver.isValidModuleName( "digit.at.123start.is.invalid" ) );
96+
}
97+
98+
@Test
99+
public void testValidModuleNames()
100+
{
101+
assertTrue( MavenArchiver.isValidModuleName( "a" ) );
102+
assertTrue( MavenArchiver.isValidModuleName( "a.b" ) );
103+
assertTrue( MavenArchiver.isValidModuleName( "a_b" ) );
104+
assertTrue( MavenArchiver.isValidModuleName( "trailing0.digits123.are456.ok789" ) );
105+
assertTrue( MavenArchiver.isValidModuleName( "UTF8.chars.are.okay.äëïöüẍ" ) );
106+
assertTrue( MavenArchiver.isValidModuleName( "ℤ€ℕ" ) );
107+
}
108+
85109
@Test
86110
public void testGetManifestExtensionList()
87111
throws Exception
@@ -500,6 +524,7 @@ public void testManifestEntries()
500524
Map<String, String> manifestEntries = new HashMap<String, String>();
501525
manifestEntries.put( "foo", "bar" );
502526
manifestEntries.put( "first-name", "olivier" );
527+
manifestEntries.put( "Automatic-Module-Name", "org.apache.maven.archiver" );
503528
manifestEntries.put( "keyWithEmptyValue", null );
504529
config.setManifestEntries( manifestEntries );
505530

@@ -532,6 +557,7 @@ public void testManifestEntries()
532557

533558
assertEquals( "bar", manifest.get( new Attributes.Name( "foo" ) ) );
534559
assertEquals( "olivier", manifest.get( new Attributes.Name( "first-name" ) ) );
560+
assertEquals( "org.apache.maven.archiver", manifest.getValue( "Automatic-Module-Name" ) );
535561

536562
assertEquals( System.getProperty( "java.version" ), manifest.get( new Attributes.Name( "Build-Jdk" ) ) );
537563
assertEquals( System.getProperty( "user.name" ), manifest.get( new Attributes.Name( "Built-By" ) ) );
@@ -544,6 +570,33 @@ public void testManifestEntries()
544570
assertEquals( "value", manifest.get( new Attributes.Name( "key" ) ) );
545571
}
546572

573+
@Test
574+
public void testManifestWithInvalidAutomaticModuleNameThrowsOnCreateArchive()
575+
throws Exception
576+
{
577+
File jarFile = new File( "target/test/dummy.jar" );
578+
JarArchiver jarArchiver = getCleanJarArchiver( jarFile );
579+
580+
MavenArchiver archiver = getMavenArchiver( jarArchiver );
581+
582+
MavenSession session = getDummySession();
583+
MavenProject project = getDummyProject();
584+
MavenArchiveConfiguration config = new MavenArchiveConfiguration();
585+
586+
Map<String, String> manifestEntries = new HashMap<String, String>();
587+
manifestEntries.put( "Automatic-Module-Name", "123.in-valid.new.name" );
588+
config.setManifestEntries( manifestEntries );
589+
590+
try
591+
{
592+
archiver.createArchive( session, project, config );
593+
}
594+
catch ( ManifestException e )
595+
{
596+
assertEquals( "Invalid automatic module name: '123.in-valid.new.name'", e.getMessage() );
597+
}
598+
}
599+
547600
@Test
548601
public void testCreatedByManifestEntryWithoutMavenVersion()
549602
throws Exception

0 commit comments

Comments
 (0)