diff --git a/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java b/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java index efadb58f..e90b2c7a 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java +++ b/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java @@ -19,7 +19,7 @@ package org.apache.maven.plugins.assembly.archive; import java.io.File; -import java.util.Date; +import java.nio.file.attribute.FileTime; import org.apache.maven.plugins.assembly.AssemblerConfigurationSource; import org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException; @@ -65,6 +65,6 @@ File createArchive( AssemblerConfigurationSource configSource, boolean recompressZippedFiles, String mergeManifestMode, - Date sourceDateEpoch) + FileTime sourceDateEpoch) throws ArchiveCreationException, AssemblyFormattingException, InvalidAssemblerConfigurationException; } diff --git a/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java b/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java index a1128706..9e54cddd 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java +++ b/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java @@ -26,9 +26,9 @@ import java.io.StringReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.nio.file.attribute.FileTime; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Map; @@ -128,7 +128,7 @@ public File createArchive( final AssemblerConfigurationSource configSource, boolean recompressZippedFiles, String mergeManifestMode, - Date outputTimestamp) + FileTime outputTimestamp) throws ArchiveCreationException, AssemblyFormattingException, InvalidAssemblerConfigurationException { validate(assembly); @@ -271,21 +271,25 @@ protected Archiver createArchiver( final List containerHandlers, boolean recompressZippedFiles, String mergeManifestMode, - Date outputTimestamp) + FileTime outputTimestamp) throws NoSuchArchiverException { Archiver archiver; - if ("txz".equals(format) - || "tgz".equals(format) - || "tbz2".equals(format) - || "tzst".equals(format) - || format.startsWith("tar")) { - archiver = createTarArchiver(format, TarLongFileMode.valueOf(configSource.getTarLongFileMode())); - } else if ("war".equals(format)) { - archiver = createWarArchiver(); + + // one missing alias in plexus-archiver + if ("tzst".equals(format)) { + archiver = createTarZstArchiver(); } else { archiver = archiverManager.getArchiver(format); } + if (archiver instanceof TarArchiver) { + ((TarArchiver) archiver).setLongfile(TarLongFileMode.valueOf(configSource.getTarLongFileMode())); + } + + if (archiver instanceof WarArchiver) { + ((WarArchiver) archiver).setExpectWebXml(false); + } + if (archiver instanceof AbstractZipArchiver) { ((AbstractZipArchiver) archiver).setRecompressAddedZips(recompressZippedFiles); } @@ -323,13 +327,12 @@ protected Archiver createArchiver( archiver = new DryRunArchiver(archiver, LOGGER); } - archiver.setUseJvmChmod(configSource.isUpdateOnly()); archiver.setIgnorePermissions(configSource.isIgnorePermissions()); archiver.setForced(!configSource.isUpdateOnly()); // configure for Reproducible Builds based on outputTimestamp value if (outputTimestamp != null) { - archiver.configureReproducible(outputTimestamp); + archiver.configureReproducibleBuild(outputTimestamp); } if (configSource.getOverrideUid() != null) { @@ -460,49 +463,9 @@ private Object[] getContainerRealm() { } } - protected Archiver createWarArchiver() throws NoSuchArchiverException { - final WarArchiver warArchiver = (WarArchiver) archiverManager.getArchiver("war"); - warArchiver.setIgnoreWebxml(false); // See MNG-1274 - - return warArchiver; - } - - protected Archiver createTarArchiver(final String format, final TarLongFileMode tarLongFileMode) - throws NoSuchArchiverException { + protected Archiver createTarZstArchiver() throws NoSuchArchiverException { final TarArchiver tarArchiver = (TarArchiver) archiverManager.getArchiver("tar"); - final int index = format.indexOf('.'); - if (index >= 0) { - TarArchiver.TarCompressionMethod tarCompressionMethod; - // TODO: this should accept gz and bz2 as well so we can skip - // TODO: over the switch - final String compression = format.substring(index + 1); - if ("gz".equals(compression)) { - tarCompressionMethod = TarArchiver.TarCompressionMethod.gzip; - } else if ("bz2".equals(compression)) { - tarCompressionMethod = TarArchiver.TarCompressionMethod.bzip2; - } else if ("xz".equals(compression)) { - tarCompressionMethod = TarArchiver.TarCompressionMethod.xz; - } else if ("snappy".equals(compression)) { - tarCompressionMethod = TarArchiver.TarCompressionMethod.snappy; - } else if ("zst".equals(compression)) { - tarCompressionMethod = TarArchiver.TarCompressionMethod.zstd; - } else { - // TODO: better handling - throw new IllegalArgumentException("Unknown compression format: " + compression); - } - tarArchiver.setCompression(tarCompressionMethod); - } else if ("tgz".equals(format)) { - tarArchiver.setCompression(TarArchiver.TarCompressionMethod.gzip); - } else if ("tbz2".equals(format)) { - tarArchiver.setCompression(TarArchiver.TarCompressionMethod.bzip2); - } else if ("txz".equals(format)) { - tarArchiver.setCompression(TarArchiver.TarCompressionMethod.xz); - } else if ("tzst".equals(format)) { - tarArchiver.setCompression(TarArchiver.TarCompressionMethod.zstd); - } - - tarArchiver.setLongfile(tarLongFileMode); - + tarArchiver.setCompression(TarArchiver.TarCompressionMethod.zstd); return tarArchiver; } } diff --git a/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java b/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java index 466234d2..d5eeea79 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java +++ b/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java @@ -19,8 +19,8 @@ package org.apache.maven.plugins.assembly.mojos; import java.io.File; +import java.nio.file.attribute.FileTime; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Properties; @@ -475,8 +475,9 @@ public void execute() throws MojoExecutionException, MojoFailureException { // TODO: include dependencies marked for distribution under certain formats // TODO: how, might we plug this into an installer, such as NSIS? - MavenArchiver mavenArchiver = new MavenArchiver(); - Date outputDate = mavenArchiver.parseOutputTimestamp(outputTimestamp); + FileTime outputDate = MavenArchiver.parseBuildOutputTimestamp(outputTimestamp) + .map(FileTime::from) + .orElse(null); boolean warnedAboutMainProjectArtifact = false; for (final Assembly assembly : assemblies) { @@ -484,10 +485,10 @@ public void execute() throws MojoExecutionException, MojoFailureException { final String fullName = AssemblyFormatUtils.getDistributionName(assembly, this); List effectiveFormats = formats; - if (effectiveFormats == null || effectiveFormats.size() == 0) { + if (effectiveFormats == null || effectiveFormats.isEmpty()) { effectiveFormats = assembly.getFormats(); } - if (effectiveFormats == null || effectiveFormats.size() == 0) { + if (effectiveFormats == null || effectiveFormats.isEmpty()) { throw new MojoFailureException( "No formats specified in the execution parameters or the assembly descriptor."); } diff --git a/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java b/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java index 83267c51..4c52231b 100644 --- a/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java +++ b/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java @@ -31,6 +31,7 @@ import org.apache.maven.plugins.assembly.filter.ContainerDescriptorHandler; import org.apache.maven.plugins.assembly.model.Assembly; import org.apache.maven.plugins.assembly.mojos.AbstractAssemblyMojo; +import org.apache.maven.plugins.assembly.testutils.PojoConfigSource; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.DefaultPlexusContainer; import org.codehaus.plexus.PlexusContainer; @@ -39,6 +40,7 @@ import org.codehaus.plexus.archiver.ArchiverException; import org.codehaus.plexus.archiver.diags.NoOpArchiver; import org.codehaus.plexus.archiver.manager.ArchiverManager; +import org.codehaus.plexus.archiver.manager.NoSuchArchiverException; import org.codehaus.plexus.archiver.tar.TarArchiver; import org.codehaus.plexus.archiver.tar.TarLongFileMode; import org.codehaus.plexus.archiver.war.WarArchiver; @@ -53,6 +55,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; @@ -137,7 +140,7 @@ public void testCreateArchive() throws Exception { verify(configSource).isDryRun(); verify(configSource).isIgnoreDirFormatExtensions(); verify(configSource).isIgnorePermissions(); - verify(configSource, times(2)).isUpdateOnly(); + verify(configSource).isUpdateOnly(); verify(phase).execute(eq(assembly), any(Archiver.class), eq(configSource)); @@ -179,7 +182,7 @@ public void testCreateArchiver_ShouldConfigureArchiver() throws Exception { when(configSource.getOverrideGid()).thenReturn(0); when(configSource.getOverrideGroupName()).thenReturn("root"); - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); + final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>()); subject.createArchiver("dummy", false, "finalName", configSource, null, false, null, null); @@ -204,7 +207,7 @@ public void testCreateArchiver_ShouldCreateTarArchiverWithNoCompression() throws when(configSource.getOverrideGid()).thenReturn(0); when(configSource.getOverrideGroupName()).thenReturn("root"); - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); + final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>()); subject.createArchiver("tar", false, "finalName", configSource, null, false, null, null); @@ -221,13 +224,13 @@ public void testCreateArchiver_ShouldCreateTarArchiverWithNoCompression() throws verify(configSource).getWorkingDirectory(); verify(configSource).isDryRun(); verify(configSource).isIgnorePermissions(); - verify(configSource, times(2)).isUpdateOnly(); + verify(configSource).isUpdateOnly(); verify(archiverManager).getArchiver("tar"); } @Test - public void testCreateArchiver_ShouldCreateWarArchiverWithIgnoreWebxmlSetToFalse() throws Exception { + public void testCreateArchiver_ShouldCreateWarArchiverWitEexpectWebXmlSetToFalse() throws Exception { final TestWarArchiver twArchiver = new TestWarArchiver(); when(archiverManager.getArchiver("war")).thenReturn(twArchiver); @@ -241,11 +244,12 @@ public void testCreateArchiver_ShouldCreateWarArchiverWithIgnoreWebxmlSetToFalse when(configSource.getWorkingDirectory()).thenReturn(new File(".")); when(configSource.isIgnorePermissions()).thenReturn(true); - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); + final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>()); subject.createArchiver("war", false, null, configSource, null, false, null, null); - assertFalse(twArchiver.ignoreWebxml); + assertNotNull(twArchiver.expectWebXml); + assertFalse(twArchiver.expectWebXml); // result of easymock migration, should be assert of expected result instead of verifying methodcalls verify(configSource).getArchiverConfig(); @@ -259,7 +263,7 @@ public void testCreateArchiver_ShouldCreateWarArchiverWithIgnoreWebxmlSetToFalse verify(configSource).getWorkingDirectory(); verify(configSource).isDryRun(); verify(configSource).isIgnorePermissions(); - verify(configSource, times(2)).isUpdateOnly(); + verify(configSource).isUpdateOnly(); verify(archiverManager).getArchiver("war"); } @@ -278,7 +282,7 @@ public void testCreateArchiver_ShouldCreateZipArchiver() throws Exception { when(configSource.getWorkingDirectory()).thenReturn(new File(".")); when(configSource.isIgnorePermissions()).thenReturn(true); - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); + final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>()); subject.createArchiver("zip", false, null, configSource, null, false, null, null); @@ -291,157 +295,26 @@ public void testCreateArchiver_ShouldCreateZipArchiver() throws Exception { verify(configSource).getWorkingDirectory(); verify(configSource).isDryRun(); verify(configSource).isIgnorePermissions(); - verify(configSource, times(2)).isUpdateOnly(); + verify(configSource).isUpdateOnly(); verify(archiverManager).getArchiver("zip"); } - @Test - public void testCreateWarArchiver_ShouldDisableIgnoreWebxmlOption() throws Exception { - final TestWarArchiver twArchiver = new TestWarArchiver(); - - when(archiverManager.getArchiver("war")).thenReturn(twArchiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createWarArchiver(); - - assertFalse(twArchiver.ignoreWebxml); - - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("war"); - } - @Test public void testCreateTarArchiver_ShouldNotInitializeCompression() throws Exception { final TestTarArchiver archiver = new TestTarArchiver(); when(archiverManager.getArchiver("tar")).thenReturn(archiver); - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createTarArchiver("tar", TarLongFileMode.fail); - - assertNull(new TestTarArchiver().compressionMethod); - assertEquals(TarLongFileMode.fail, archiver.longFileMode); - - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); - } - - @Test - public void testCreateTarArchiver_TarGzFormat_ShouldInitializeGZipCompression() throws Exception { - final TestTarArchiver archiver = new TestTarArchiver(); - - when(archiverManager.getArchiver("tar")).thenReturn(archiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createTarArchiver("tar.gz", TarLongFileMode.fail); - - assertEquals(TarArchiver.TarCompressionMethod.gzip, archiver.compressionMethod); - assertEquals(TarLongFileMode.fail, archiver.longFileMode); - - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); - } - - @Test - public void testCreateTarArchiver_TgzFormat_ShouldInitializeGZipCompression() throws Exception { - final TestTarArchiver archiver = new TestTarArchiver(); - - when(archiverManager.getArchiver("tar")).thenReturn(archiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createTarArchiver("tgz", TarLongFileMode.fail); - - assertEquals(TarArchiver.TarCompressionMethod.gzip, archiver.compressionMethod); - assertEquals(TarLongFileMode.fail, archiver.longFileMode); - - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); - } - - @Test - public void testCreateTarArchiver_TarBz2Format_ShouldInitializeBZipCompression() throws Exception { - final TestTarArchiver archiver = new TestTarArchiver(); - - when(archiverManager.getArchiver("tar")).thenReturn(archiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createTarArchiver("tar.bz2", TarLongFileMode.fail); - - assertEquals(TarArchiver.TarCompressionMethod.bzip2, archiver.compressionMethod); - assertEquals(TarLongFileMode.fail, archiver.longFileMode); - - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); - } - - @Test - public void testCreateTarArchiver_Tbz2Format_ShouldInitializeBZipCompression() throws Exception { - final TestTarArchiver archiver = new TestTarArchiver(); - - when(archiverManager.getArchiver("tar")).thenReturn(archiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createTarArchiver("tbz2", TarLongFileMode.fail); - - assertEquals(TarArchiver.TarCompressionMethod.bzip2, archiver.compressionMethod); - assertEquals(TarLongFileMode.fail, archiver.longFileMode); - - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); - } - - @Test - public void testCreateTarArchiver_TarXzFormat_ShouldInitializeXzCompression() throws Exception { - final TestTarArchiver archiver = new TestTarArchiver(); - - when(archiverManager.getArchiver("tar")).thenReturn(archiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createTarArchiver("tar.xz", TarLongFileMode.fail); - - assertEquals(TarArchiver.TarCompressionMethod.xz, archiver.compressionMethod); - assertEquals(TarLongFileMode.fail, archiver.longFileMode); - - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); - } - - @Test - public void testCreateTarArchiver_TXzFormat_ShouldInitializeXzCompression() throws Exception { - final TestTarArchiver archiver = new TestTarArchiver(); - - when(archiverManager.getArchiver("tar")).thenReturn(archiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); + final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>()); - subject.createTarArchiver("txz", TarLongFileMode.fail); + PojoConfigSource configSource = new PojoConfigSource(); + configSource.setTarLongFileMode(TarLongFileMode.fail.name()); + configSource.setWorkingDirectory(new File("")); - assertEquals(TarArchiver.TarCompressionMethod.xz, archiver.compressionMethod); - assertEquals(TarLongFileMode.fail, archiver.longFileMode); + subject.createArchiver("tar", true, "", configSource, null, false, null, null); - // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); - } - - @Test - public void testCreateTarArchiver_TarZstFormat_ShouldInitializeZstCompression() throws Exception { - final TestTarArchiver archiver = new TestTarArchiver(); - - when(archiverManager.getArchiver("tar")).thenReturn(archiver); - - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); - - subject.createTarArchiver("tar.zst", TarLongFileMode.fail); - - assertEquals(TarArchiver.TarCompressionMethod.zstd, archiver.compressionMethod); + assertNull(new TestTarArchiver().compressionMethod); assertEquals(TarLongFileMode.fail, archiver.longFileMode); // result of easymock migration, should be assert of expected result instead of verifying methodcalls @@ -454,9 +327,13 @@ public void testCreateTarArchiver_TZstFormat_ShouldInitializeZstCompression() th when(archiverManager.getArchiver("tar")).thenReturn(archiver); - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); + final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>()); - subject.createTarArchiver("tzst", TarLongFileMode.fail); + PojoConfigSource configSource = new PojoConfigSource(); + configSource.setTarLongFileMode(TarLongFileMode.fail.name()); + configSource.setWorkingDirectory(new File("")); + + subject.createArchiver("tzst", true, "", configSource, null, false, null, null); assertEquals(TarArchiver.TarCompressionMethod.zstd, archiver.compressionMethod); assertEquals(TarLongFileMode.fail, archiver.longFileMode); @@ -469,20 +346,20 @@ public void testCreateTarArchiver_TZstFormat_ShouldInitializeZstCompression() th public void testCreateTarArchiver_InvalidFormat_ShouldFailWithInvalidCompression() throws Exception { final TestTarArchiver ttArchiver = new TestTarArchiver(); - when(archiverManager.getArchiver("tar")).thenReturn(ttArchiver); + when(archiverManager.getArchiver("tar.ZZZ")).thenThrow(new NoSuchArchiverException("no archiver")); - final DefaultAssemblyArchiver subject = createSubject(new ArrayList()); + final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>()); try { - subject.createTarArchiver("tar.Z", null); + subject.createArchiver("tar.ZZZ", true, "", null, null, false, null, null); fail("Invalid compression formats should throw an error."); - } catch (final IllegalArgumentException e) { + } catch (final NoSuchArchiverException e) { // expected. } // result of easymock migration, should be assert of expected result instead of verifying methodcalls - verify(archiverManager).getArchiver("tar"); + verify(archiverManager).getArchiver("tar.ZZZ"); } private DefaultAssemblyArchiver createSubject(final List phases) { @@ -516,12 +393,12 @@ public void setLongfile(final TarLongFileMode mode) { private static final class TestWarArchiver extends WarArchiver { - boolean ignoreWebxml; + Boolean expectWebXml; @Override - public void setIgnoreWebxml(final boolean ignore) { - ignoreWebxml = ignore; - super.setIgnoreWebxml(ignore); + public void setExpectWebXml(boolean expectWebXml) { + this.expectWebXml = expectWebXml; + super.setExpectWebXml(expectWebXml); } }