JAR文件最小体积发布
博客专区 > jimyao 的博客 > 博客详情
JAR文件最小体积发布
jimyao 发表于2年前
JAR文件最小体积发布
  • 发表于 2年前
  • 阅读 6
  • 收藏 0
  • 点赞 1
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 运行时候加入参数-XX:+TraceClassLoading,跟踪程序类的加载哪些类。把程序需要的类及相关的类提取出来,做一个新的JAR文件,这样可以实现最小体积的发布.
import java.io.*;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

/**
 * Created by jimyao on 2016/1/23.
 * 使用-XX:+TraceClassLoading输出程序所需要的class,定制jar文件
 */
public class Test6 {
    static BufferedReader fileIn;
    static ArrayList<String> newClassList;
    static JarInputStream jarIn;
    static JarOutputStream jarOut;
    static byte[] bytes;
    static final String rtFileName = "C://Program Files//Java//jdk1.8.0_65//jre//lib//rt.jar";

    public Test6() throws IOException {
        newClassList = new ArrayList<>();
        bytes = new byte[1024];
        jarIn = new JarInputStream(new BufferedInputStream(new FileInputStream(rtFileName)));
        jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream("C:\\1\\newrt.jar")));
    }

    private static void doJar(String sourceFile) throws FileNotFoundException, IOException {

        try {
            fileIn = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile)));

            String readLine = null;
            while ((readLine = fileIn.readLine()) != null) {
                String[] subLine = readLine.split(" ");
                String newClass = subLine[1];
                newClassList.add(newClass.replace(".", "/").trim());
            }
            JarEntry entry = null;
            while ((entry = jarIn.getNextJarEntry()) != null) {
                String fullName = entry.getName();
                String className = entry.getName().substring(0, fullName.lastIndexOf("."));
                if (newClassList.contains(className)) {
                    jarOut.putNextEntry(entry);

                    int len = jarIn.read(bytes);
                    while (len != -1) {
                        jarOut.write(bytes, 0, len);
                        len = jarIn.read(bytes);
                    }
                }
            }
        } finally {
            if (fileIn != null)
                fileIn.close();
            if (jarIn != null)
                jarIn.close();
            if (jarOut != null)
                jarOut.close();

        }
    }
 
  public static void main(String... args) throws IOException {
        Test6 test6 = new Test6();
        test6.doJar("C:\\1\\sourceFile.txt");
    }
}
标签: Java JAR
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 17
博文 66
码字总数 27856
×
jimyao
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: