集册 Java实例教程 将给定文件添加到指定的JAR文件。

将给定文件添加到指定的JAR文件。

欢马劈雪     最近更新时间:2020-01-02 10:19:05

648
将给定文件添加到指定的JAR文件。
/* from 
n o w    j a v a  . c o m*/

/*

 * Copyright @ 2006-2010 by The Jxva Framework Foundation

 * 

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 * 

 *      http://www.apache.org/licenses/LICENSE-2.0

 * 

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.jar.Attributes;

import java.util.jar.JarEntry;// 来 自 nowjava.com - 时  代  Java

import java.util.jar.JarFile;

import java.util.jar.JarInputStream;

import java.util.jar.JarOutputStream;

import java.util.jar.Manifest;

import java.util.zip.CRC32;

import java.util.zip.ZipFile;

import java.util.zip.ZipOutputStream;


public class Main{

    /**

     * Adds the given file to the specified JAR file.

     * 

     * @param file the file that should be added

     * @param jarFile The JAR to which the file should be added

     * @param parentDir the parent directory of the file, this is used to calculate the path witin the JAR file.

     *                  When null is given, the file will be added into the root of the JAR.

     * @param compress True when the jar file should be compressed

     * @throws FileNotFoundException when the jarFile does not exist

     * @throws IOException when a file could not be written or the jar-file could not read.

     */

    public static void addToJar(File file, File jarFile, File parentDir,

            boolean compress) throws FileNotFoundException, IOException {

        File tmpJarFile = File.createTempFile("tmp", ".jar",

                jarFile.getParentFile());

        JarOutputStream out = new JarOutputStream(new FileOutputStream(

                tmpJarFile));

        if (compress) {

            out.setLevel(ZipOutputStream.DEFLATED);

        } else {

            out.setLevel(ZipOutputStream.STORED);

        }

        // copy contents of old jar to new jar:

        JarFile inputFile = new JarFile(jarFile);

        JarInputStream in = new JarInputStream(new FileInputStream(jarFile));

        CRC32 crc = new CRC32();

        byte[] buffer = new byte[512 * 1024];

        JarEntry entry = (JarEntry) in.getNextEntry();

        while (entry != null) {

            InputStream entryIn = inputFile.getInputStream(entry);

            add(entry, entryIn, out, crc, buffer);

            entryIn.close();

            entry = (JarEntry) in.getNextEntry();

        }

        in.close();

        inputFile.close();


        int sourceDirLength;

        if (parentDir == null) {

            sourceDirLength = file.getAbsolutePath().lastIndexOf(

                    File.separatorChar) + 1;

        } else {

            sourceDirLength = file.getAbsolutePath().lastIndexOf(

                    File.separatorChar)

                    + 1 - parentDir.getAbsolutePath().length();

        }

        addFile(file, out, crc, sourceDirLength, buffer);

        out.close();


        // remove old jar file and rename temp file to old one:

        if (jarFile.delete()) {

            if (!tmpJarFile.renameTo(jarFile)) {

                throw new IOException(

                        "Unable to rename temporary JAR file to ["

                                + jarFile.getAbsolutePath() + "].");

            }

        } else {

            throw new IOException("Unable to delete old JAR file ["

                    + jarFile.getAbsolutePath() + "].");

        }


    }

    /**

     * @param entry

     * @param in

     * @param out

     * @param crc

     * @param buffer

     * @throws IOException

     */

    private static void add(JarEntry entry, InputStream in,

            JarOutputStream out, CRC32 crc, byte[] buffer)

            throws IOException {

        out.putNextEntry(entry);

        int read;

        long size = 0;

        while ((read = in.read(buffer)) != -1) {

            crc.update(buffer, 0, read);

            out.write(buffer, 0, read);

            size += read;

        }

        entry.setCrc(crc.getValue());

        entry.setSize(size);

        in.close();

        out.closeEntry();

        crc.reset();

    }

    /**

     * Adds one file to the given jar file.

     * If the specified file is a directory, all included files will be added.

     * 

     * @param file The file which should be added

     * @param out The jar file to which the given jar file should be added

     * @param crc A helper class for the CRC32 calculation

     * @param sourceDirLength The number of chars which can be skipped from the file's path

     * @param buffer A buffer for reading the files.

     * @throws FileNotFoundException when the file was not found

     * @throws IOException when the file could not be read or not be added

     */

    
展开阅读全文