目的:此前操作人员一直是用excel中的函数来进行一个业务数据的计算,由于此法操作不太方便,故应项目经理要求,用java写一个小工具,算法现成,只要能实现即可,于是写了一个html格式的,一个基于swing的exe文件,此文主要讲exe文件集成的jre瘦身。
但由于使用者的电脑环境中并未配置jre环境,所以我们在导出的exe文件中需集成jre,现在的我使用的jre1.8大小已经超过200M,而java文件却只有几百kb,有种头重脚轻的感觉,所以,对jre进行瘦身,删减掉没有用的文件是有必要的,删减后文件将不超过20M。
以下为正文:
本篇转载自:https://blog.csdn.net/xiaoping8411/article/details/6973887

打开JRE安装目录.目录包括bin,lib二个文件夹,所以就是将这两个文件进行瘦身了

  1. bin: 可以认为这是Java虚拟机.

  2. lib: 执行class文件时,Java虚拟机需要用到的类库及资源文件.

一、bin瘦身(瘦身之后大小约为5M)

方法为:

运行该exe文件,然后进入bin文件中,删除所有能删的,不能删除的系统会提示让重试;删完之后重新运行该工具,如果正常运行,那么bin文件就算搞定了。

二、lib的瘦身(重头戏,完成后大小约为10M)
① lib目录最主要的类库是rt.jar,是任意Java程序所必需的类库.
lib目录大约100MB,但是rt.jar类库就占了一半多,可见精简bin目录,最主要是裁剪rt.jar.

② lib目录下一个运行Java程序不可或缺的文件是位于i386下的虚拟机配置文件jvm.cfg.该配置文件用来管理不同版本的jvm.dll.其内容作为java.exe,javac.exe的全局变量,用来加载相应的动态链接库文件.

③ lib目录里面除了包含程序运行所需要的类库及配置文件外,还包含有一些诸如: 鼠标光标,字体等系统资源.简单程序如果未用到这部分资源的话,可以剔除.如果程序除去JRE部分,占用空间较大的话,为了避除资源加载错误带来的麻烦,建议保留这不到20MB的配置文件内容.

主要步骤如下:

1、提取我们需要的类库(jar),借助-verbose命令,查看虚拟机在运行Java程序时所加载的所有类,如:

@echo off
C:/Java/jdk1.6.0_16/bin/java -jar  -classpath lib/*.jar; -verbose:class printSoft.jar >> class.txt
pause

在class.txt文件中保存如下的信息:

[Loaded java.lang.Math from shared objects file]
[Loaded java.nio.charset.Charset$3 from C:\Java\jdk1.6.0_16\jre\lib\rt.jar]
[Opened C:\Java\jdk1.6.0_16\jre\lib\charsets.jar]
[Loaded sun.nio.cs.AbstractCharsetProvider from C:\Java\jdk1.6.0_16\jre\lib\rt.jar]
[Loaded sun.nio.cs.ext.ExtendedCharsets from C:\Java\jdk1.6.0_16\jre\lib\charsets.jar]
[Loaded java.lang.Class$1 from shared objects file]
[Loaded sun.reflect.ReflectionFactory$1 from shared objects file]
[Loaded sun.reflect.NativeConstructorAccessorImpl from shared objects file]

我们可以从class.txt中得到我们需要的jar文件和class文件,提交jar很简单,我就不说了,下面我们在看看如何提交我们用到的class文件:
由于class.txt每行都是形同: [Loaded java.lang.System from shared objects file]的一串字符,修改文本以方便获取类完整名java.lang.System,从而获得类似类路径java/lang/System的一串字符,方便后继编写类拷贝程序.
修改方法:
1. 查找并替换[Loaded 为空,达到删除[Loaded 的目的.
2. 使用任意一个具有正则表达式查找替换功能的文本编辑器,查找并替换 from.*为空,达到删除 from及其后面的字符串的目的.
3. 查找并替换.为/
4. 删除以[Opened 开头的行.
5. 删除程序中System.out.println的输出行.
提取之后class.txt就剩下如下信息:

java/lang/Object
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/String
java/lang/reflect/GenericDeclaration
.......

2、从现有的jar包中提取我们整理的class文件,然后打包成jar,最终取代原有的jar,下面是一个提取class的工具类:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class CopyClass
{private String source = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";      // 类源目录private String dest = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";        // 类拷贝目的目录String[] jarArr = new String[]{"rt","charsets"};/**** * @param source 类源目录* @param dest   类拷贝目的目录* @param jarArr 需要的提取的jar文件*/public CopyClass(String source,String dest,String[] jarArr){this.source=source;this.dest=dest;this.jarArr=jarArr;}public static void main(String[] args){String[] jarArr = new String[]{"rt","charsets"};CopyClass obj = new CopyClass("C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\","C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",jarArr);obj.readAndCopy("C:\\Users\\lzp\\Desktop\\printSoft\\class.txt");}/**** @param logName 提取class明细*/public void readAndCopy(String logName){int count = 0;  // 用于记录成功拷贝的类数try{FileInputStream fi = new FileInputStream(logName);InputStreamReader ir = new InputStreamReader(fi);BufferedReader br = new BufferedReader(ir);String string = br.readLine();while(string != null){if(copyClass(string) == true)count++;elseSystem.out.println("ERROR " + count + ": " + string);string = br.readLine();}}catch (IOException e){System.out.println("ERROR: " + e);}System.out.println("count: " + count);}/**** 从原jar路径提取相应的类到目标路径,如将java/lang/CharSequence类从rt目录提取到rt1目录* @param string 提取类的全路径* @return* @throws IOException*/public boolean copyClass(String string) throws IOException{String classDir = string.substring(0,string.lastIndexOf("/"));String className = string.substring(string.lastIndexOf("/")+1,string.length()) + ".class";boolean result =false;for(String jar : jarArr){File srcFile = new File(source + "/"+jar+"/" + classDir + "/" + className);if(!srcFile.exists()){continue;}byte buf[] = new byte[256];FileInputStream fin = new FileInputStream(srcFile);/* 目标目录不存在,创建 */File destDir = new File(dest + "/"+jar+"1/" + classDir);if(!destDir.exists())destDir.mkdirs();File destFile = new File(destDir + "/" + className);FileOutputStream fout = new FileOutputStream(destFile);int len = 0;while((len = fin.read(buf)) != -1){fout.write(buf,0,len);}fout.flush();result = true;break;}return result;}
}

然后在将提取的class文件打包成jar文件,利用jar命令进行打包,然后替换以前的jar文件,这样lib就从以前的六十多M到几M多有,如图:

大功告成,最后打包好交给操作人员即可。

JRE瘦身 制作小工具相关推荐

  1. java jre 减少尺寸_整理JRE瘦身或精简JRE

    前不久给朋友做了一个桌面程序,程序文件没多大,但运行java程序需要jre,但jre足足有80M多,然后在网上搜了如何给给JRE瘦身或精简JRE,整理如下: 打开JRE安装目录.目录包括bin,lib ...

  2. 姓氏头像制作小工具超多制作模板的姓氏头像生成器微信小程序源码最新版

    内容目录 一.详细介绍 二.效果展示 1.部分代码 2.效果图展示 三.学习资料下载 一.详细介绍 这是一款姓氏头像制作小工具 内含丰富多样的模板提供制作 以前的基本是固定位置生成 这款制作支持拖拽调 ...

  3. 个人目标日历定制制作小工具微信小程序(含源码)

    简介: 这是一个个人目标日历制作小工具 简单来说就相当于手机上面带的提醒事项类似 另外拥有日历查看功能 具体小编就不多说了,大家自行下载研究吧! 代码运行效果 图片: 首页 <view clas ...

  4. 个人目标日历定制制作小工具微信小程序源码

    简介: 这是一个个人目标日历制作小工具 简单来说就相当于手机上面带的提醒事项类似 另外拥有日历查看功能 具体小编就不多说了,大家自行下载研究吧! https://www.skpan.cn/Dd37us ...

  5. JRE8 打包瘦身(180M的JRE瘦身成11M,OMG)

    最近接到一个考试软件的试用版,需要让用户下载到本地,解压后直接运行的.对于C#来说这都不是事,可以JAVA就惨了,JRE本身就180多M,让用户下载这么大个包,一定会被吐槽.于是要瘦身. 首先去这里下 ...

  6. photoshop ps 瘦身方法 液化工具

    原图: 效果: 1.首先打开模特的照片 2.双击背景图层,使它变成可编辑的图层 3.用椭圆选框工具,把模特的脸部选择出来 4.使用液化滤镜,画笔大小设置为406,其他参数如图,对模特脸部进行修饰 5. ...

  7. python制作小工具_利用Python制作翻译小工具

    话不多说,直接上代码. Component文件: # coding:utf-8 from tkinter import * from tkinter import ttk from tkinter i ...

  8. APK瘦身优化检测工具-Matrix ApkChecker 使用

    简介 Matrix-ApkChecker 作为Matrix系统的一部分,是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,并输出较为详细的检测结果报告,用于 ...

  9. 比KEEP更好,运动健身、塑形瘦身的小程序新选择

    随生着活水平的提高以及压力的增大,很多的人都有着身材走形等各种各样问的题.今天要介绍的这款小程序,就是针对平时工作生活学习任务繁忙,没有整块时间进行锻炼的人们,每天几分钟轻松拥有好身材,成为别人眼中的 ...

  10. 那些堪称神器的PPT制作小工具

    一.建立自己的PPT素材资源库 很多PPT素材不是到你要用时再去寻找,平时就应该做个有心人,把别人课件里那些好玩的.精美的.新颖的素材,如边框.漫画人物像.标题栏或其他符号等,都及时复制到自己的素材库 ...

最新文章

  1. 年轻,误把unix当linux
  2. 如何通过抓包实战来学习Web协议?
  3. 2019.7.9 校内测试题 史密斯数
  4. 独立于三大FPGA平台采用modelsim仿真
  5. php去除数组中的第一个元素,php如何删除数组的第一个元素和最后一个元素
  6. apache karaf_未来是Apache Karaf上的微服务架构
  7. android bench内存测试,华为p10内存测试软件(androbench) v5.0.1 免费版
  8. 谷歌回归中国,最紧张的为什么会是小米、华为们?
  9. 基于matlab的谱估计,基于MATLAB的功率谱估计实验.doc
  10. puppet进阶指南——cron资源详解
  11. 小米手机电池恢复代码_小米手机隐藏技巧,你真的会用吗?别再浪费如此强大的功能了...
  12. SDOI2019R2翻车记
  13. Sunny带你半小时掌握Mybati关联映射
  14. 布法罗大学计算机硕士学费,美国水牛城大学学费贵不贵(美国水牛城大学往年排名情况怎么样)...
  15. Vue后台管理系统项目——实现登录功能
  16. 笨拙的手指——acwing算法题第一天
  17. android 群英传笔记,Android 群英传读书笔记1
  18. 不想进大厂的程序员是没有梦想的,2021年阿里、腾讯,java架构师指南百度云
  19. 批量生成不重复的虚拟卡卡号和密码
  20. 塔望·食业研究丨方便速食行业市场主要竞争品牌分析及研究

热门文章

  1. java将图片转化为base64码
  2. 【Unity3D Shader编程】之八 Unity5新版Shader模板源码解析径向模糊屏幕特效的实现
  3. java安装报错循环冗余检查_数据错误 循环冗余检查怎么解决
  4. 2.9Unicode 文本标准化
  5. JZOJ 3337. 【NOI2013模拟】wyl8899的TLE
  6. QuatusII--7段数码管
  7. hdu5510Bazinga
  8. Riverbed:SDN向广域网扩展为企业带来哪些价值
  9. windows server2012计算机管理“系统工具”里面没有“本地用户和组”怎么办?
  10. cmd 一键清除系统垃圾