Package org.codehaus.plexus.archiver.jar
Class JarArchiver
- java.lang.Object
-
- org.codehaus.plexus.logging.AbstractLogEnabled
-
- org.codehaus.plexus.archiver.AbstractArchiver
-
- org.codehaus.plexus.archiver.zip.AbstractZipArchiver
-
- org.codehaus.plexus.archiver.zip.ZipArchiver
-
- org.codehaus.plexus.archiver.jar.JarArchiver
-
- All Implemented Interfaces:
Archiver
,FinalizerEnabled
,org.codehaus.plexus.logging.LogEnabled
,org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable
- Direct Known Subclasses:
EarArchiver
,ModularJarArchiver
,WarArchiver
public class JarArchiver extends ZipArchiver
Base class for tasks that build archives in JAR file format.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
JarArchiver.FilesetManifestConfig
-
Field Summary
Fields Modifier and Type Field Description private Manifest
configuredManifest
merged manifests added through addConfiguredManifestprivate boolean
createEmpty
whether to really create the archive in createEmptyZip, will get set in getResourcesToAdd.private Manifest
filesetManifest
merged manifests added through filesetsprivate JarArchiver.FilesetManifestConfig
filesetManifestConfig
whether to merge fileset manifests; value is true if filesetmanifest is 'merge' or 'mergewithoutmain'private boolean
index
jar index is JDK 1.3+ onlyprivate static java.lang.String
INDEX_NAME
The index file name.private java.util.ArrayList<java.lang.String>
indexJars
Path containing jars that shall be indexed in addition to this archive.private Manifest
manifest
the manifest specified by the 'manifest' attribute *private static java.lang.String
MANIFEST_NAME
The manifest file name.private java.io.File
manifestFile
The file found from the 'manifest' attribute.private boolean
mergeManifestsMain
whether to merge the main section of fileset manifests; value is true if filesetmanifest is 'merge'private static java.lang.String
META_INF_NAME
the name of the meta-inf dirprivate boolean
minimalDefaultManifest
Creates a minimal default manifest withManifest-Version: 1.0
only.private Manifest
originalManifest
Manifest of original archive, will be set to null if not in update mode.private java.util.Vector<java.lang.String>
rootEntries
Stores all files that are in the root of the archive (i.e.private Manifest
savedConfiguredManifest
shadow of the above if upToDate check alters the value-
Fields inherited from class org.codehaus.plexus.archiver.zip.AbstractZipArchiver
addedDirs, addingNewFiles, archiveType, doubleFilePass, duplicate, entries, skipWriting, zipArchiveOutputStream
-
Fields inherited from interface org.codehaus.plexus.archiver.Archiver
DEFAULT_DIR_MODE, DEFAULT_FILE_MODE, DEFAULT_SYMLILNK_MODE, DUPLICATES_ADD, DUPLICATES_FAIL, DUPLICATES_PRESERVE, DUPLICATES_SKIP, DUPLICATES_VALID_BEHAVIORS, ROLE
-
-
Constructor Summary
Constructors Constructor Description JarArchiver()
constructor
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description void
addConfiguredIndexJars(java.io.File indexJar)
void
addConfiguredManifest(Manifest newManifest)
Allows the manifest for the archive file to be provided inline in the build file rather than in an external file.protected void
cleanUp()
Make sure we don't think we already have a MANIFEST next time this task gets executed.protected boolean
createEmptyZip(java.io.File zipFile)
Create an empty zip fileprivate void
createIndexList(ConcurrentJarCreator zOut)
Create the index list to speed up classloading.protected Manifest
createManifest()
Creates the manifest to be added to the JAR archive.private void
filesetManifest(java.io.File file, java.io.InputStream is)
protected void
finalizeZipOutputStream(ConcurrentJarCreator zOut)
protected static java.lang.String
findJarName(java.lang.String fileName, java.lang.String[] classpath)
try to guess the name of the given file.private Manifest
getManifest(java.io.File manifestFile)
private Manifest
getManifest(java.io.InputStream is)
protected static void
grabFilesAndDirs(java.lang.String file, java.util.List<java.lang.String> dirs, java.util.List<java.lang.String> files)
Grab lists of all root-level files and all directories contained in the given archive.protected boolean
hasVirtualFiles()
protected void
initZipOutputStream(ConcurrentJarCreator zOut)
method for subclasses to overridevoid
reset()
reset to default values.void
setFilesetmanifest(JarArchiver.FilesetManifestConfig config)
Behavior when a Manifest is found in a zipfileset or zipgroupfileset file.void
setIndex(boolean flag)
Set whether or not to create an index list for classes.void
setManifest(java.io.File manifestFile)
The manifest file to use.void
setManifestEncoding(java.lang.String manifestEncoding)
Deprecated.void
setMinimalDefaultManifest(boolean minimalDefaultManifest)
Set whether the default manifest is minimal, thus having onlyManifest-Version: 1.0
in it.protected void
writeIndexLikeList(java.util.List<java.lang.String> dirs, java.util.List<java.lang.String> files, java.io.PrintWriter writer)
Writes the directory entries from the first and the filenames from the second list to the given writer, one entry per line.private void
writeManifest(ConcurrentJarCreator zOut, Manifest manifest)
protected void
zipFile(org.apache.commons.compress.parallel.InputStreamSupplier is, ConcurrentJarCreator zOut, java.lang.String vPath, long lastModified, java.io.File fromArchive, int mode, java.lang.String symlinkDestination, boolean addInParallel)
Overridden from Zip class to deal with manifests and index lists.-
Methods inherited from class org.codehaus.plexus.archiver.zip.AbstractZipArchiver
addResources, close, createInputStreamSupplier, execute, getArchiveType, getComment, getEncoding, isCompress, isFilesonly, isInUpdateMode, isRecompressAddedZips, isSupportingForced, normalizeLastModifiedDate, revert, setComment, setCompress, setEncoding, setFilesonly, setRecompressAddedZips, setUpdateMode, zipDir, zipFile
-
Methods inherited from class org.codehaus.plexus.archiver.AbstractArchiver
addArchivedFileSet, addArchivedFileSet, addArchivedFileSet, addArchivedFileSet, addArchivedFileSet, addArchivedFileSet, addArchiveFinalizer, addDirectory, addDirectory, addDirectory, addDirectory, addFile, addFile, addFileSet, addResource, addResources, addSymlink, addSymlink, asArchiveEntry, asResourceCollection, checkForced, configureReproducible, contextualize, createArchive, getDefaultDirectoryMode, getDefaultFileMode, getDestFile, getDirectoryMode, getDuplicateBehavior, getFileMode, getFilenameComparator, getFiles, getIncludeEmptyDirs, getLastModifiedDate, getLogger, getOverrideDirectoryMode, getOverrideFileMode, getOverrideGid, getOverrideGroupName, getOverrideUid, getOverrideUserName, getRawDefaultFileMode, getResources, isForced, isIgnorePermissions, isUptodate, isUseJvmChmod, postCreateArchive, runArchiveFinalizers, setArchiveFinalizers, setDefaultDirectoryMode, setDefaultFileMode, setDestFile, setDirectoryMode, setDotFileDirectory, setDuplicateBehavior, setFileMode, setFilenameComparator, setForced, setIgnorePermissions, setIncludeEmptyDirs, setLastModifiedDate, setOverrideGid, setOverrideGroupName, setOverrideUid, setOverrideUserName, setUseJvmChmod, validate
-
-
-
-
Field Detail
-
META_INF_NAME
private static final java.lang.String META_INF_NAME
the name of the meta-inf dir- See Also:
- Constant Field Values
-
INDEX_NAME
private static final java.lang.String INDEX_NAME
The index file name.- See Also:
- Constant Field Values
-
MANIFEST_NAME
private static final java.lang.String MANIFEST_NAME
The manifest file name.- See Also:
- Constant Field Values
-
configuredManifest
private Manifest configuredManifest
merged manifests added through addConfiguredManifest
-
savedConfiguredManifest
private Manifest savedConfiguredManifest
shadow of the above if upToDate check alters the value
-
filesetManifest
private Manifest filesetManifest
merged manifests added through filesets
-
originalManifest
private Manifest originalManifest
Manifest of original archive, will be set to null if not in update mode.
-
filesetManifestConfig
private JarArchiver.FilesetManifestConfig filesetManifestConfig
whether to merge fileset manifests; value is true if filesetmanifest is 'merge' or 'mergewithoutmain'
-
mergeManifestsMain
private boolean mergeManifestsMain
whether to merge the main section of fileset manifests; value is true if filesetmanifest is 'merge'
-
manifest
private Manifest manifest
the manifest specified by the 'manifest' attribute *
-
manifestFile
private java.io.File manifestFile
The file found from the 'manifest' attribute. This can be either the location of a manifest, or the name of a jar added through a fileset. If its the name of an added jar, the manifest is looked for in META-INF/MANIFEST.MF
-
index
private boolean index
jar index is JDK 1.3+ only
-
createEmpty
private boolean createEmpty
whether to really create the archive in createEmptyZip, will get set in getResourcesToAdd.
-
rootEntries
private java.util.Vector<java.lang.String> rootEntries
Stores all files that are in the root of the archive (i.e. that have a name that doesn't contain a slash) so they can get listed in the index. Will not be filled unless the user has asked for an index.
-
indexJars
private java.util.ArrayList<java.lang.String> indexJars
Path containing jars that shall be indexed in addition to this archive.
-
minimalDefaultManifest
private boolean minimalDefaultManifest
Creates a minimal default manifest withManifest-Version: 1.0
only.
-
-
Method Detail
-
setIndex
public void setIndex(boolean flag)
Set whether or not to create an index list for classes. This may speed up classloading in some cases.- Parameters:
flag
- true to create an index
-
setMinimalDefaultManifest
public void setMinimalDefaultManifest(boolean minimalDefaultManifest)
Set whether the default manifest is minimal, thus having onlyManifest-Version: 1.0
in it.- Parameters:
minimalDefaultManifest
- true to create minimal default manifest
-
setManifestEncoding
@Deprecated public void setManifestEncoding(java.lang.String manifestEncoding)
Deprecated.
-
addConfiguredManifest
public void addConfiguredManifest(Manifest newManifest) throws ManifestException
Allows the manifest for the archive file to be provided inline in the build file rather than in an external file.- Parameters:
newManifest
- The new manifest- Throws:
ManifestException
- .
-
setManifest
public void setManifest(java.io.File manifestFile) throws ArchiverException
The manifest file to use. This can be either the location of a manifest, or the name of a jar added through a fileset. If its the name of an added jar, the task expects the manifest to be in the jar at META-INF/MANIFEST.MF.- Parameters:
manifestFile
- the manifest file to use.- Throws:
ArchiverException
- .
-
getManifest
private Manifest getManifest(java.io.File manifestFile) throws ArchiverException
- Throws:
ArchiverException
-
getManifest
private Manifest getManifest(java.io.InputStream is) throws ArchiverException
- Throws:
ArchiverException
-
setFilesetmanifest
public void setFilesetmanifest(JarArchiver.FilesetManifestConfig config)
Behavior when a Manifest is found in a zipfileset or zipgroupfileset file. Valid values are "skip", "merge", and "mergewithoutmain". "merge" will merge all of manifests together, and merge this into any other specified manifests. "mergewithoutmain" merges everything but the Main section of the manifests. Default value is "skip".Note: if this attribute's value is not "skip", the created jar will not be readable by using java.util.jar.JarInputStream
- Parameters:
config
- setting for found manifest behavior.
-
addConfiguredIndexJars
public void addConfiguredIndexJars(java.io.File indexJar)
- Parameters:
indexJar
- The indexjar
-
initZipOutputStream
protected void initZipOutputStream(ConcurrentJarCreator zOut) throws ArchiverException, java.io.IOException
Description copied from class:AbstractZipArchiver
method for subclasses to override- Overrides:
initZipOutputStream
in classAbstractZipArchiver
- Parameters:
zOut
- The output stream- Throws:
ArchiverException
java.io.IOException
-
hasVirtualFiles
protected boolean hasVirtualFiles()
- Overrides:
hasVirtualFiles
in classAbstractArchiver
-
createManifest
protected Manifest createManifest() throws ArchiverException
Creates the manifest to be added to the JAR archive. Sub-classes may choose to override this method in order to inspect or modify the JAR manifest file.- Returns:
- the manifest for the JAR archive.
- Throws:
ArchiverException
-
writeManifest
private void writeManifest(ConcurrentJarCreator zOut, Manifest manifest) throws java.io.IOException, ArchiverException
- Throws:
java.io.IOException
ArchiverException
-
finalizeZipOutputStream
protected void finalizeZipOutputStream(ConcurrentJarCreator zOut) throws java.io.IOException, ArchiverException
- Overrides:
finalizeZipOutputStream
in classAbstractZipArchiver
- Throws:
java.io.IOException
ArchiverException
-
createIndexList
private void createIndexList(ConcurrentJarCreator zOut) throws java.io.IOException, ArchiverException
Create the index list to speed up classloading. This is a JDK 1.3+ specific feature and is enabled by default. See the JAR index specification for more details.- Parameters:
zOut
- the zip stream representing the jar being built.- Throws:
java.io.IOException
- thrown if there is an error while creating the index and adding it to the zip stream.ArchiverException
- .
-
zipFile
protected void zipFile(org.apache.commons.compress.parallel.InputStreamSupplier is, ConcurrentJarCreator zOut, java.lang.String vPath, long lastModified, java.io.File fromArchive, int mode, java.lang.String symlinkDestination, boolean addInParallel) throws java.io.IOException, ArchiverException
Overridden from Zip class to deal with manifests and index lists.- Overrides:
zipFile
in classAbstractZipArchiver
- Parameters:
is
- the stream to read data for the entry from.zOut
- the stream to write to.vPath
- the name this entry shall have in the archive.lastModified
- last modification time for the entry.fromArchive
- the original archive we are copying thisaddInParallel
- Indicates if the entry should be add in parallel. If set tofalse
it is added synchronously. If the entry is symbolic link this parameter is ignored.- Throws:
java.io.IOException
ArchiverException
-
filesetManifest
private void filesetManifest(java.io.File file, java.io.InputStream is) throws ArchiverException
- Throws:
ArchiverException
-
createEmptyZip
protected boolean createEmptyZip(java.io.File zipFile) throws ArchiverException
Description copied from class:AbstractZipArchiver
Create an empty zip file- Overrides:
createEmptyZip
in classAbstractZipArchiver
- Parameters:
zipFile
- The file- Returns:
- true for historic reasons
- Throws:
ArchiverException
-
cleanUp
protected void cleanUp() throws java.io.IOException
Make sure we don't think we already have a MANIFEST next time this task gets executed.- Overrides:
cleanUp
in classAbstractZipArchiver
- Throws:
java.io.IOException
- See Also:
AbstractZipArchiver.cleanUp()
-
reset
public void reset()
reset to default values.- Overrides:
reset
in classAbstractZipArchiver
- See Also:
AbstractZipArchiver.reset()
-
writeIndexLikeList
protected final void writeIndexLikeList(java.util.List<java.lang.String> dirs, java.util.List<java.lang.String> files, java.io.PrintWriter writer)
Writes the directory entries from the first and the filenames from the second list to the given writer, one entry per line.- Parameters:
dirs
- The directoriesfiles
- The fileswriter
- The printwriter ;)
-
findJarName
protected static java.lang.String findJarName(java.lang.String fileName, java.lang.String[] classpath)
try to guess the name of the given file.If this jar has a classpath attribute in its manifest, we can assume that it will only require an index of jars listed there. try to find which classpath entry is most likely the one the given file name points to.
In the absence of a classpath attribute, assume the other files will be placed inside the same directory as this jar and use their basename.
if there is a classpath and the given file doesn't match any of its entries, return null.
- Parameters:
fileName
- .classpath
- .- Returns:
- The guessed name
-
grabFilesAndDirs
protected static void grabFilesAndDirs(java.lang.String file, java.util.List<java.lang.String> dirs, java.util.List<java.lang.String> files) throws java.io.IOException
Grab lists of all root-level files and all directories contained in the given archive.- Parameters:
file
- .files
- .dirs
- .- Throws:
java.io.IOException
- .
-
-