Class JarArchiver

All Implemented Interfaces:
Archiver, FinalizerEnabled
Direct Known Subclasses:
EarArchiver, ModularJarArchiver, RarArchiver, WarArchiver

@Named("jar") public class JarArchiver extends ZipArchiver
Base class for tasks that build archives in JAR file format.
  • Field Details

    • META_INF_NAME

      private static final String META_INF_NAME
      the name of the meta-inf dir
      See Also:
    • INDEX_NAME

      @Deprecated private static final String INDEX_NAME
      Deprecated.
      The index file name.
      See Also:
    • MANIFEST_NAME

      private static final String MANIFEST_NAME
      The manifest file name.
      See Also:
    • 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 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

      @Deprecated private boolean index
      Deprecated.
      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 final List<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

      @Deprecated private List<String> indexJars
      Deprecated.
      Path containing jars that shall be indexed in addition to this archive.
    • minimalDefaultManifest

      private boolean minimalDefaultManifest
      Creates a minimal default manifest with Manifest-Version: 1.0 only.
  • Constructor Details

    • JarArchiver

      public JarArchiver()
      constructor
  • Method Details

    • setIndex

      @Deprecated public void setIndex(boolean flag)
      Deprecated.
      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 only Manifest-Version: 1.0 in it.
      Parameters:
      minimalDefaultManifest - true to create minimal default manifest
    • setManifestEncoding

      @Deprecated public void setManifestEncoding(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(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(File manifestFile) throws ArchiverException
      Throws:
      ArchiverException
    • getManifest

      private Manifest getManifest(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

      @Deprecated public void addConfiguredIndexJars(File indexJar)
      Deprecated.
      Parameters:
      indexJar - The indexjar
    • initZipOutputStream

      protected void initZipOutputStream(ConcurrentJarCreator zOut) throws ArchiverException, IOException
      Description copied from class: AbstractZipArchiver
      method for subclasses to override
      Overrides:
      initZipOutputStream in class AbstractZipArchiver
      Parameters:
      zOut - The output stream
      Throws:
      ArchiverException
      IOException
    • hasVirtualFiles

      protected boolean hasVirtualFiles()
      Overrides:
      hasVirtualFiles in class AbstractArchiver
    • 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 IOException, ArchiverException
      Throws:
      IOException
      ArchiverException
    • finalizeZipOutputStream

      protected void finalizeZipOutputStream(ConcurrentJarCreator zOut) throws IOException, ArchiverException
      Overrides:
      finalizeZipOutputStream in class AbstractZipArchiver
      Throws:
      IOException
      ArchiverException
    • createIndexList

      @Deprecated private void createIndexList(ConcurrentJarCreator zOut) throws IOException, ArchiverException
      Deprecated.
      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:
      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, String vPath, long lastModified, File fromArchive, int mode, String symlinkDestination, boolean addInParallel) throws IOException, ArchiverException
      Overridden from Zip class to deal with manifests and index lists.
      Overrides:
      zipFile in class AbstractZipArchiver
      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 this
      symlinkDestination -
      addInParallel - Indicates if the entry should be add in parallel. If set to false it is added synchronously. If the entry is symbolic link this parameter is ignored.
      Throws:
      IOException
      ArchiverException
    • filesetManifest

      private void filesetManifest(File file, InputStream is) throws ArchiverException
      Throws:
      ArchiverException
    • createEmptyZip

      protected boolean createEmptyZip(File zipFile) throws ArchiverException
      Description copied from class: AbstractZipArchiver
      Create an empty zip file
      Overrides:
      createEmptyZip in class AbstractZipArchiver
      Parameters:
      zipFile - The file
      Returns:
      true for historic reasons
      Throws:
      ArchiverException
    • cleanUp

      protected void cleanUp() throws IOException
      Make sure we don't think we already have a MANIFEST next time this task gets executed.
      Overrides:
      cleanUp in class AbstractZipArchiver
      Throws:
      IOException
      See Also:
    • reset

      public void reset()
      reset to default values.
      Overrides:
      reset in class AbstractZipArchiver
      See Also:
    • writeIndexLikeList

      @Deprecated protected final void writeIndexLikeList(List<String> dirs, List<String> files, PrintWriter writer)
      Deprecated.
      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 directories
      files - The files
      writer - The printwriter ;)
    • findJarName

      protected static String findJarName(String fileName, 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

      private void grabFilesAndDirs(String file, List<String> dirs, List<String> files) throws IOException
      Grab lists of all root-level files and all directories contained in the given archive.
      Parameters:
      file - .
      dirs - .
      files - .
      Throws:
      IOException
    • setZipEntryTime

      protected void setZipEntryTime(org.apache.commons.compress.archivers.zip.ZipArchiveEntry zipEntry, long lastModifiedTime)
      Override the behavior of the Zip Archiver to match the output of the JAR tool.
      Overrides:
      setZipEntryTime in class AbstractZipArchiver
      Parameters:
      zipEntry - to set the last modified time
      lastModifiedTime - to set in the zip entry only if AbstractArchiver.getLastModifiedTime() returns null