精简 jre (剪裁jdk)

jre 文件结构

-bin (启动jvm虚拟机中必要的exe和dll)

​ --java.exe (java主程序,用于启动窗口程序或非阻塞程序 )

​ --javaw.exe (用于启动 窗口程序或非阻塞程序 程序)

​ --其他exe (基本都可删除)

​ --server (jvm虚拟机的存放目录)

​ —jvm.dll(jvm 虚拟机)

​ --其他dll

-lib (Java 运行环境所使用的核心类库、属性设置和资源文件)

​ --rt.jar (java提供的基本类库,包含了 Java 平台的核心 API。重点精简对象)

​ --其他资源

精简jre

准备jre

  • 将需要精简的版本的 jre 拷贝一份到一个你能找到的地方(安装Java后,jre一般位于 C:\Program Files\Java 下 )
  • 拷贝需要运行的项目到jre同级目录

精简jre目录

在jre目录下,除了bin目录,lib目录的其他文件均可删除

精简bin目录

为了方便操作可删除 jre 文件夹名称中的版本信息,如 jre1.8.0_191 删除后为 jre

  • 打开 cmd,进入jre 文件夹所在的目录,使用本目录的jre运行你的项目,如:

    一般情况运行你的项目是:java -jar xxx.jar 或 javaw -jar xxx.jar

    现在你应该:jre\bin\java.exe -jar xxx.jar 或 jre\bin\javaw.exe -jar xxx.jar

  • 使用文件管理器打开bin文件夹

  • 在运行项目的同时,逐一删除bin文件夹下的文件,能删除的表示不需要,可以都删除

  • 删除完成后 bin 目录的精简完成,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DvuG79Pe-1573559441201)(E:/%E7%AC%94%E8%AE%B0/%E6%AF%8F%E6%97%A5%E5%B0%8F%E7%BB%93/img/2019-11-11-%E7%B2%BE%E7%AE%80bin.png)]

精简lib文件夹

在jre1.8中 rt.jar 类库就占了52.1 MB,所以精简lib文件的主要任务就是精简 rt.jar

精简除 rt.jar 外的其他文件(如果对精简要求不高,或者嫌麻烦的可省略本步骤)

逐个将 lib 下的文件剪切至其它地方,让后运行项目,若项目无法成功运行,则将该文件粘贴回本地

精简rt.jar
提取需要的类

可借助 -ferbose 命令,查看虚拟机在运行 Java 程序时所加载的所有类

java -jar -verbose:class xxx.jar >>class.txt

然后运行一遍项目的所有功能(尽可能的所有功能都运行一遍)

在 class.txt 中可以查看到该项目所需要的所有类

重新打包 rt.jar
得到rt需要的类的路径

class.txt 中的条目都形同 [Loaded java.lang.Object from C:\Users\john\Desktop\a\jre\lib\rt.jar] ,我们需要获取每个类的路径,如 java\lang\Object ,以方便我们后面复制所需要的类

  • 仅读取 含有 rt.jar 的条目
  • 提取条目中的 java.lang.Object
  • 将 . 修改为 \

代码如下:

java:
public static void get_class_path_file(String class_file_path,
			String re_class_file_path) {
   
		try {
   
			BufferedReader in = new BufferedReader(new InputStreamReader(
					new FileInputStream(class_file_path), "utf-8"));
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(re_class_file_path), "utf-8"));
			String str = null;
			while ((str = in.readLine()) != null) {
   
				if((str.indexOf("rt.jar") != -1) && (str.indexOf("Loaded") != -1)) {
   
					String class_name = str.substring(8, str.indexOf("from")-1);
					String class_path = class_name.replace(".", 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值