整理JRE瘦身或精简JRE
http://blog.csdn.net/xiaoping8411/article/details/6973887
版权声明:本文为博主原创文章,未经博主允许不得转载。
前不久给朋友做了一个桌面程序,程序文件没多大,但运行java程序需要jre,但jre足足有80M多,然后在网上搜了如何给给JRE瘦身或精简JRE,整理如下:
打开JRE安装目录.目录包括bin,lib二个文件夹,所以就是将这两个文件进行瘦身了,
1. bin: 可以认为这是Java虚拟机.
2. lib: 执行class文件时,Java虚拟机需要用到的类库及资源文件.
一、bin瘦身主要从两方面考虑
① exe文件,最主要的工具是java.exe,它用来执行class文件,如果只是为了单纯运行Java程序的话,其他可执行文件一般都是用不到的(可剔除).
② DLL文件,是java.exe执行class文件过程中调用的,执行class文件,java.exe需要哪个库文件就加载哪个dll,不需用的可以剔除.
我们要做的就是找到哪些DLL文件是有用?我们运行一个Java文件看看,可以利用360安全卫士得到
1、准备java文件:
- /*
- @author jarg
- @TODO 举例查看当前程序必需的dll文件
- */
- import java.io.InputStreamReader;
- import java.io.IOException;
- public class Hello
- {
- public static void main(String[] args) throws IOException
- {
- InputStreamReader ir = new InputStreamReader(System.in);
- System.out.println("Hello");
- ir.read();
- }
- }
2、编译、运行
3、360安全卫士 -> 功能大全 -> 进程管理器 右上角的显示加载到当前选中进程中的dll
4、这样我们留下java.exe、有用的dll文件和client目录就行
到这里bin的瘦身成功!
二、lib的瘦身
① lib目录最主要的类库是rt.jar,是任意Java程序所必需的类库.
lib目录大约62MB,但是rt.jar类库就占了47MB,可见精简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++;
- else
- System.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的瘦身!
整理JRE瘦身或精简JRE的更多相关文章
- JRE“瘦身”&桌面程序集成JRE
项目是一个桌面程序,程序文件不大,但运行jre有198 MB,因此需要"瘦身". jre包含bin.lib两部分,分别为93.6 MB.104 MB. 1.精简bin 运行桌面程序 ...
- Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云
alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...
- 精简JRE的思路初探
引言: JRE是Java程序赖以执行的基础环境,眼下JRE已经很的庞大;即使为了执行一个简单的Hello World的程序.可能依旧须要依赖整个JRE,将近百兆大小的依赖性. 能否够对特定Java程序 ...
- iOS内置图片瘦身思路整理
一.前言 前段时间注意到我们APP的包大小超过100MB了,所以随口跟老板说了下能否采用字体文件(.ttf)替代PNG图片,老板对应用瘦身很感兴趣因此让我做下技术调研.这篇文章主要是将我们的各个技术方 ...
- Java 精简Jre jar打包成exe
#开始 最近几天都在忙一个事情,那就是尝试精简jre,我想不明白为什么甲骨文官方不出exe打包工具... 网络上精简jre的文章很多,但是原创的似乎没几个,绝大多数都是转发同一个博客, 这里借鉴了不少 ...
- docker镜像瘦身思路
docker镜像瘦身思路 一.简介 docker镜像太大,带来了以下几个问题: 存储开销 这块影响其实不算很大,因为对服务器磁盘来说,15GB的存储空间并不算大,除非用户服务器的磁盘空间很紧张 部署时 ...
- 菜鸟学Java(十七)——Jboss瘦身
大家在用Jboss的时候可能跟我一样,觉得Jboss启动实在太慢!比起Tomcat几乎秒启的速度,Jboss几乎让人无法忍受.加上本人电脑配置比较低,Jboss启动最快的时候也是一分多钟,慢的时候四分 ...
- Android应用瘦身
转:https://zhuanlan.zhihu.com/p/25465537 瘦身的目的 从目的导向来看,我们是不会无缘无故去做一件事情的,那我们对应用瘦身的目的是为了什么?答案是:提高下载转化率. ...
- APK瘦身记,如何实现高达53%的压缩效果
作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...
随机推荐
- android studio布局文件/XML怎么代码补全
android studio中的布局文件代码补全方式是打第一个字母就提示了,而java代码有时候要按快捷键. 布局文件的话呢,要写在标签开始处才提示,在标签闭合处有时候不提示,有时候在内容里也会有不提 ...
- C#中partial关键字
1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在 ...
- WPF(x:Null 使用)
<Window x:Class="TestOfNull.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...
- opencv基础知识------IplImage, CvMat, Mat 的关系和相互转换
Mat,cvMat和IplImage这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化.而CvMat和IplImage类型更侧重于“图像 ...
- scrollView的bounds
如果scrollView的contentoffset为(100,0) 那么scrollView的bounds就是(100,y,w,h)
- Got Stucked in C++ Static Library Loading.. for some time
I used to load library using 1 single .dll file, so when I happen to do method calling between 2 pro ...
- php薪资
2千的php程序员就是可以用cms,做一个小企业的门户网站. 3千的php程序员,可以自己写代码开发php软件,但是这样程序员写的代码非常混乱,通常只能写数千行代码的小软件,并且痛苦的完工. 4K的p ...
- 如何给grldr.mbr和grldr改名
grldr修改方法: 比如要把grldr 改成gzldr :1.先把文件名改成gzldr:2.用ultraedit或winhex打开gzldr:3.虽然文本框全都是乱码,别管它,把光标定位在右边文本框 ...
- 在win7/8/10鼠标右键添加“管理员取得所有权”
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\Shell\TakeAuthority]"icon"=" ...
- angularJS Directive学习
Directive 指令 直接上实例 index.html <!doctype html> <html ng-app="drag"> <head> ...