⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jarbuilder.java

📁 TestDataBuilder是一个采用Java编写的
💻 JAVA
字号:
package com.testDataBuilder.util.pkg;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.InvalidPropertiesFormatException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;


public class JarBuilder {

    public String workspaceDir = System.getProperty("user.dir");    
    public static final String SEP = System.getProperty("file.separator");
    public final String META_INF = "META-INF";    
    public final String MANIFEST_FILE_NAME = "MANIFEST.MF";
    public final String LINE_SEP = System.getProperty("line.separator");
    
    public static final String TEMP_CONFIG = "JarBuilder.config.xml";
    
    
    public void saveConfig(Properties properties, File configFile){
        if(properties != null && properties.size() > 0){
            try {
                properties.storeToXML(new FileOutputStream(configFile), "");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public Properties loadFromConfig(File file){
        Properties properties = new Properties();
        try {
            properties.loadFromXML(new FileInputStream(file));
        } catch (InvalidPropertiesFormatException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return properties;
    }
    
    /**
     * <p><code>main</code></p>
     * @param args
     * @author LiuXiaojie 2007-10-12
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {        
        JarBuilder jarBuilder =  new JarBuilder();        
        jarBuilder.build();
    }
    
    String baseDir = null;
    String destDir = null;
    String version = null;
    String mainClass = null;       
    String jarName = null;
    
    public static final String BASE_DIR = "baseDir";
    public static final String VERSION = "version";
    public static final String MAIN_CLASS = "mainClass";
    public static final String JAR_NAME = "jarName";
    public static final String DEST_DIR = "destDir";
    
    private static List<String> excludeDirs = null;
    public static List<String> getExcludeDirs(){
    	if(excludeDirs == null){
    		excludeDirs = new ArrayList<String>();
    		excludeDirs.add("helpdoc");  
            excludeDirs.add("language");
    	}
    	return excludeDirs;
    }
    
    public static void makeJar(File directory, File zipFile, Manifest manifest) throws FileNotFoundException {
      
    	JarOutputStream  jos = null;
        try{
            jos = new JarOutputStream(new FileOutputStream(zipFile), manifest);
            String fileNames[] = directory.list();
        if (fileNames != null) {
            for (int i = 0; i < fileNames.length; i++){
                recurseFiles(new File(directory, fileNames[i]),jos, "");
            }
        }
        }catch(IOException ex){
            ex.printStackTrace();
        }finally{
            if(jos != null){
                try {
                    jos.flush();
                    jos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    
    private static void recurseFiles(File file,JarOutputStream jos, String pathName) throws IOException, FileNotFoundException {
        if (file.isDirectory()) {
        	if(!getExcludeDirs().contains(file.getName())){
	            pathName = pathName + file.getName() + "/";
	            jos.putNextEntry(new JarEntry(pathName));
	            String fileNames[] = file.list();
	            if (fileNames != null) {
	                for (int i = 0; i < fileNames.length; i++)
	                    recurseFiles(new File(file, fileNames[i]),jos, pathName);
	
	            }
	            jos.closeEntry();
        	}
        } else if(isNotJarFile(file)){
            JarEntry jarEntry = new JarEntry(pathName + file.getName());
            System.out.println(pathName + file.getName());
            FileInputStream fin = new FileInputStream(file);
            BufferedInputStream in = new BufferedInputStream(fin);
            jos.putNextEntry(jarEntry);
            int len = -1;
            byte buf[] = new byte[1024];
            while ((len = in.read(buf)) >= 0){
                jos.write(buf, 0, len);
            }
            in.close();
            jos.closeEntry();
        }
    }

    
    public void build() throws IOException{
        //JarBuilder builder = new JarBuilder();
        File tempConfig = new File(TEMP_CONFIG);
        boolean useConfig = false;
        if(tempConfig.exists()){
            Properties properties =  this.loadFromConfig(tempConfig);
            baseDir = properties.getProperty(BASE_DIR);
            destDir = properties.getProperty(DEST_DIR);
            version = properties.getProperty(VERSION);
            mainClass = properties.getProperty(MAIN_CLASS);
            jarName = properties.getProperty(JAR_NAME);
            System.out.println("the last configure is:");
            System.out.println("    baseDir: " + baseDir);
            System.out.println("    destDir: " + destDir);            
            System.out.println("    version: " + version);
            System.out.println("  MainClass: " + mainClass);
            System.out.println("    jarName: " + jarName);
            System.out.println("=======================================");
            String result = getInput("use the last configure file to run?(Y/N)");
            if(result != null && result.equalsIgnoreCase("Y")){
                useConfig = true;
            }
        }
        
        if(!useConfig){
            String curDir = System.getProperty("user.dir");
            baseDir =  getInput("please input the basic directory(default is :" + curDir + ")" + LINE_SEP 
                            + " :");
            if(baseDir == null || baseDir.equals("")){
                baseDir = curDir;
            }
            destDir = getInput("please input the dest directory(default is :" +baseDir + ")" + LINE_SEP);
            if(destDir == null || destDir.equals("")){
                destDir = baseDir;
            }
            
            version = getInput("please input the jar version(default is 1.0):");
            if(version == null || version.equals("")){
                version = "1.0";
            }
            mainClass = getInput("please input the main class(full name):");
            String className = mainClass.substring(mainClass.lastIndexOf(".") + 1);        
            jarName = getInput("please input the jar package name(default is " + className + ".jar):");        
            
            if(jarName == null || jarName.equals("")){
                jarName = className + ".jar";
            }
            if(!jarName.endsWith(".jar")){
                jarName = jarName + ".jar";
            }
            Properties pros = new Properties();
            pros.setProperty(BASE_DIR, baseDir);
            pros.setProperty(DEST_DIR, destDir);
            pros.setProperty(VERSION, version);
            pros.setProperty(MAIN_CLASS, mainClass);
            pros.setProperty(JAR_NAME, jarName);
            this.saveConfig(pros, tempConfig);
        }
        
        autoBuildByConfigFile(tempConfig, false);
        
        
    }
    

    public void autoBuildByConfigFile(File configFile, boolean showLog) throws FileNotFoundException, IOException{
    	Properties properties =  this.loadFromConfig(configFile);
        baseDir = properties.getProperty(BASE_DIR);
        destDir = properties.getProperty(DEST_DIR);
        version = properties.getProperty(VERSION);
        mainClass = properties.getProperty(MAIN_CLASS);
        jarName = properties.getProperty(JAR_NAME);
        autoBuildByParam(baseDir,destDir,version, mainClass,jarName,showLog);
    }
    
    public void autoBuildByParam(
					    		String baseDir, 
                                String destDir,
					    		String version, 
					    		String mainClass, 
					    		String jarName, 
					    		boolean showLog) throws FileNotFoundException, IOException{
    	if(showLog){
	        System.out.println("========================= config=========================");
            System.out.println("    baseDir: " + baseDir);
            System.out.println("    destDir: " + destDir);
            System.out.println("    version: " + version);
	        System.out.println("  MainClass: " + mainClass);
	        System.out.println("    jarName: " + jarName);
	        System.out.println("========================= end =========================");
        }
        String fileName = getManifestFile(baseDir, version, mainClass, jarName);
                
        Manifest manifest = new Manifest(new FileInputStream(fileName)); 
          
        File jarFile = new File(destDir,jarName);
        
        this.makeJar(new File(baseDir), jarFile, manifest);
        
        System.out.println("jar file store in directory:" + jarFile.getAbsolutePath());
        
    }
    
    @Override
    protected void finalize() throws Throwable {
        this.deleteDirectory(new File(baseDir, META_INF));
        super.finalize();
    }

    public String getManifestFile(String baseDir, String version, String mainClass,String excludeJar){
        //version info        
        if(version == null || version.equals("")){
            version = "1.0";
        }
        StringBuffer buffer = new StringBuffer("Manifest-Version: " + version + LINE_SEP);
        
        List<String> jarFiles = new LinkedList<String>();
        getJarFiles(new File(baseDir), jarFiles, baseDir);
        
        if(jarFiles.size() > 0){
            buffer.append("Class-Path: " + LINE_SEP);
            for(String jarName : jarFiles){
                if(!jarName.equalsIgnoreCase(excludeJar)){
                    buffer.append(" " + jarName + "  " +  LINE_SEP);
                }
            }
            //buffer.append(LINE_SEP);
        }
        
        
        buffer.append("Main-Class: " + mainClass + LINE_SEP);
       
        try {
            File parentDir = new File(baseDir + SEP + META_INF);
            if(!parentDir.exists()){
                parentDir.mkdir();
            }
            return saveFile(new File(parentDir, MANIFEST_FILE_NAME), buffer.toString());            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    
    public List<String> getJarFiles(File baseDir, List<String> jarFiles, String strBaseDir){ 
        if(baseDir.isDirectory()){
            File[] files = baseDir.listFiles();
            for(File file : files){
                if(file.isDirectory()){
                    getJarFiles(file, jarFiles, strBaseDir);
                }else if (isJarFile(file)){
                    System.out.println("jar:" + file.getAbsolutePath());
                    jarFiles.add(file.getAbsolutePath().replace(strBaseDir + SEP, ""));
                }
            }            
        }
        return jarFiles;
    }
    
    static BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
    
    private static String getInput(String prompt){
        System.out.print(prompt);
        String retValue = null;
        try {
            retValue = read.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }       
        
        return retValue;
    }
    
    //[start]文件操作。
    /**
     * 保存的文件全名。
     * <p><code>saveFile</code></p>
     * @param fileName
     * @param content
     * @return
     * @throws Exception
     * @author LiuXiaojie 2007-10-12
     */
    public static String saveFile(File file, String content) throws Exception {
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
        bw.write(content);
        bw.flush();
        bw.close();
        return file.getAbsolutePath();
    }
    
    /**
     * 删除一个目录。
     * <p><code>deleteDirectory</code></p>
     * @param file
     * @author LiuXiaojie 2007-12-27
     */
    public static void deleteDirectory(File directory) throws IOException {
        if (!directory.exists()) {
            return;
        }

        cleanDirectory(directory);
        if (!directory.delete()) {
            String message =
                "Unable to delete directory " + directory + ".";
            throw new IOException(message);
        }
    }

    public static void cleanDirectory(File directory) throws IOException {
        if (!directory.exists()) {
            String message = directory + " does not exist";
            throw new IllegalArgumentException(message);
        }

        if (!directory.isDirectory()) {
            String message = directory + " is not a directory";
            throw new IllegalArgumentException(message);
        }

        File[] files = directory.listFiles();
        if (files == null) {  // null if security restricted
            throw new IOException("Failed to list contents of " + directory);
        }

        IOException exception = null;
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            try {
                forceDelete(file);
            } catch (IOException ioe) {
                exception = ioe;
            }
        }

        if (null != exception) {
            throw exception;
        }
    }

    public static void forceDelete(File file) throws IOException {
        if (file.isDirectory()) {
            deleteDirectory(file);
        } else {
            if (!file.exists()) {
                throw new FileNotFoundException("File does not exist: " + file);
            }
            if (!file.delete()) {
                String message =
                    "Unable to delete file: " + file;
                throw new IOException(message);
            }
        }
    }
    //[end]
    
    
    public static boolean isNotJarFile(File file){
        String fileName = file.getName();
        return !fileName.endsWith(".jar") && !fileName.endsWith("MANIFEST.MF") && !fileName.endsWith("META-INF");
    }
    
    public static boolean isJarFile(File file){
        String fileName = file.getName();
        return fileName.endsWith("jar") || fileName.endsWith("zip");
    }
    
    //[end]
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -