diff --git a/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java b/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java index f35569445..d424e7d1b 100644 --- a/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java @@ -91,7 +91,9 @@ public void execute() { String dest = ( (SymlinkDestinationSupplier) resource ).getSymlinkDestination(); File target = new File( dest ); - SymlinkUtils.createSymbolicLink( new File( fileName ), target ); + File symlink = new File( fileName ); + makeParentDirectories( symlink ); + SymlinkUtils.createSymbolicLink( symlink, target ); } else { @@ -142,15 +144,7 @@ protected void copyFile( final ArchiveEntry entry, final String vPath ) if ( !in.isDirectory() ) { - if ( !outFile.getParentFile().exists() ) - { - // create the parent directory... - if ( !outFile.getParentFile().mkdirs() ) - { - // Failure, unable to create specified directory for some unknown reason. - throw new ArchiverException( "Unable to create directory or parent directory of " + outFile ); - } - } + makeParentDirectories( outFile ); ResourceUtils.copyFile( entry.getInputStream(), outFile ); setFileModes( entry, outFile, inLastModified ); @@ -187,6 +181,18 @@ public void run() } + private static void makeParentDirectories( File file ) { + if ( !file.getParentFile().exists() ) + { + // create the parent directory... + if ( !file.getParentFile().mkdirs() ) + { + // Failure, unable to create specified directory for some unknown reason. + throw new ArchiverException( "Unable to create directory or parent directory of " + file ); + } + } + } + private void setFileModes( ArchiveEntry entry, File outFile, long inLastModified ) { if ( !isIgnorePermissions() ) diff --git a/src/test/java/org/codehaus/plexus/archiver/SymlinkTest.java b/src/test/java/org/codehaus/plexus/archiver/SymlinkTest.java index ca55ebd45..1697e0066 100644 --- a/src/test/java/org/codehaus/plexus/archiver/SymlinkTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/SymlinkTest.java @@ -102,6 +102,8 @@ public void testSymlinkDirArchiver() final File archiveFile = new File( "target/output/dirarchiver-symlink" ); archiveFile.mkdirs(); archiver.setDestFile( archiveFile ); + archiver.addSymlink("target/output/dirarchiver-symlink/aNewDir/symlink", "."); + archiver.createArchive(); File symbolicLink = new File( "target/output/dirarchiver-symlink/symR" );