diff --git a/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java b/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java index a393601b..efce189d 100755 --- a/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java @@ -37,6 +37,7 @@ import org.codehaus.plexus.archiver.manager.ArchiverManager; import org.codehaus.plexus.archiver.manager.NoSuchArchiverException; +import org.codehaus.plexus.archiver.manager.ServiceLoaderArchiverManager; import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils; import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes; import org.codehaus.plexus.components.io.attributes.SimpleResourceAttributes; @@ -131,6 +132,12 @@ protected Logger getLogger() { @Inject private Provider archiverManagerProvider; + /** + * Used instead of {@link #archiverManagerProvider} when this archiver was not created by a JSR-330 container, + * for example through {@link ServiceLoaderArchiverManager} or its constructor. + */ + private ArchiverManager serviceLoaderArchiverManager; + private static class AddedResourceCollection { private final PlexusIoResourceCollection resources; @@ -580,13 +587,23 @@ public void setDestFile(final File destFile) { } } + private ArchiverManager getArchiverManager() { + if (archiverManagerProvider != null) { + return archiverManagerProvider.get(); + } + if (serviceLoaderArchiverManager == null) { + serviceLoaderArchiverManager = new ServiceLoaderArchiverManager(); + } + return serviceLoaderArchiverManager; + } + protected PlexusIoResourceCollection asResourceCollection(final ArchivedFileSet fileSet, Charset charset) throws ArchiverException { final File archiveFile = fileSet.getArchive(); final PlexusIoResourceCollection resources; try { - resources = archiverManagerProvider.get().getResourceCollection(archiveFile); + resources = getArchiverManager().getResourceCollection(archiveFile); } catch (final NoSuchArchiverException e) { throw new ArchiverException( "Error adding archived file-set. PlexusIoResourceCollection not found for: " + archiveFile, e); diff --git a/src/test/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerTest.java b/src/test/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerTest.java index 45741407..0f7ffc0c 100644 --- a/src/test/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerTest.java @@ -43,9 +43,12 @@ import java.io.File; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.codehaus.plexus.archiver.Archiver; import org.codehaus.plexus.archiver.UnArchiver; +import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet; import org.codehaus.plexus.archiver.util.DefaultFileSet; import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; @@ -134,6 +137,21 @@ void reuseArchiver(@TempDir File tempDir) throws Exception { assertFalse(newArchiver.getResources().hasNext()); } + @Test + void archiverAddsArchivedFileSetWithoutContainer(@TempDir File tempDir) throws Exception { + ArchiverManager manager = new ServiceLoaderArchiverManager(); + File archiveFile = new File(tempDir, "repacked.zip"); + + Archiver archiver = manager.getArchiver("zip"); + archiver.setDestFile(archiveFile); + archiver.addArchivedFileSet(DefaultArchivedFileSet.archivedFileSet(new File("src/test/resources/test.zip"))); + archiver.createArchive(); + + try (ZipFile zipFile = new ZipFile(archiveFile)) { + assertThat(zipFile.stream().map(ZipEntry::getName)).anyMatch(name -> name.endsWith("ZipUnArchiver.java")); + } + } + @Test void allArchiversShouldBeUnderTest() { ArchiverManager manager = new ServiceLoaderArchiverManager();