0. 思路:
1)把自己的应用程序打包成可运行的jar包
2)通过jar命令运行这个jar包
3)把jar包所需要的类全部打印到文本文件中
4)把上一步产生的类从文件中提取出来重新打包
5)去掉jre中bin和lib目中下的不需要的文件和目录
1. 打包运行,使用下面bat将所用到的类全部输出到文件中
@echo off set path=.\jre\bin .\jre\bin\java -jar -verbose:class lottery.jar > class.txt @pause
2. class.txt文件处理
class.txt文件格式如下
[Opened D:\baiduyundownload\Lottery\jre\lib\rt.jar] [Loaded java.lang.Object from D:\baiduyundownload\Lottery\jre\lib\rt.jar] [Loaded java.io.Serializable from D:\baiduyundownload\Lottery\jre\lib\rt.jar] [Loaded java.lang.Comparable from D:\baiduyundownload\Lottery\jre\lib\rt.jar] [Loaded java.lang.CharSequence from D:\baiduyundownload\Lottery\jre\lib\rt.jar] [Loaded java.lang.String from D:\baiduyundownload\Lottery\jre\lib\rt.jar]
这里使用到的是rt.jar和charsets.jar,将其分别抽取出来,抽取出来的格式如下:
sun/nio/cs/ext/ExtendedCharsets sun/nio/cs/ext/GBK sun/nio/cs/ext/DoubleByteDecoder sun/nio/cs/ext/GBK$Decoder sun/nio/cs/ext/DoubleByteEncoder sun/nio/cs/ext/GBK$Encoder
抽取步骤:
grep rt.jar class.txt > rt.txt # 32位的jvm,使用rt.jar有下面这种格式 grep "from shared objects file" class.txt >> rt.txt grep charsets class.txt > charsets.txt vi命令 %s/\[Loaded //g # 替换掉行头 %s/ from *.*//g # 替换掉行尾 %s/\./\//g # .替换成/
3. 重新打包
1)首先将jre目录中的rt.jar, charsets.jar分别解压到输入目录,运行如下代码
参数:./data/rt.txt ./data/rt ./output/rt
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; public class ReduceClasses { /** * 文件拷贝 * * @param srcFileName * @param destFileName * @return */ public static boolean copy(String srcFileName, String destFileName) { try { FileInputStream in = new FileInputStream(new File(srcFileName)); FileOutputStream out = new FileOutputStream(new File(destFileName)); try { byte[] bytes = new byte[1024]; int c = -1; while ((c = in.read(bytes)) != -1) out.write(bytes, 0, c); in.close(); out.close(); } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } catch (Exception e) { e.printStackTrace(); return (false); } return (true); } /** * 读取路径,copy * * @param classFile * @param srcRtDir * @param destRtDir * @return * @throws IOException */ public static int dealClass(String classFile, String srcRtDir, String destRtDir) { int sucessCount = 0; try { LineNumberReader reader = new LineNumberReader(new FileReader(new File(classFile))); try { String line = null; while ((line = reader.readLine()) != null) { int pos = line.lastIndexOf("/"); if (pos > 0) { File dir = new File(destRtDir + line.substring(0, pos)); if (!dir.exists()) dir.mkdirs(); String srcFileName = srcRtDir + line + ".class"; String destFileName = destRtDir + line + ".class"; if (copy(srcFileName, destFileName)) sucessCount++; else { System.out.println(line); } } } } finally { if (reader != null) { reader.close(); } } } catch (IOException e) { e.printStackTrace(); } return sucessCount; } public static void main(String[] args) { if (args == null || args.length != 3) { System.err.println("Usage: ReduceClasses classFile srcRtDir destRtDir"); } String classFile = args[0]; // 运行JAR生成的,应用程序所需类的txt文件 String srcRtDir = args[1]; // rt.jar解压后的目录 String destRtDir = args[2]; // 抽取的类存放目录 if (!srcRtDir.endsWith("/")) { srcRtDir += "/"; } if (!destRtDir.endsWith("/")) { destRtDir += "/"; } System.out.print("Success Count: " + dealClass(classFile, srcRtDir, destRtDir)); } }
2)将原有rt目录中的META-INF拷贝到新的rt目录中去,进入新的rt目录,使用rar打成zip包,然后重命名为rt.jar. charsets同样处理
4. 精简jre中其他无用文件
1)新建jre目录,在其中建两个子目录bin和lib
2)将新生成的rt.jar和charsets.jar拷贝到lib中
3)从原生jre的lib中拷贝出i386和zi两个子目录,其中zi里面只保留America和Asia两个目录
4)原生jre的lib中除了库文件和文件夹之外的所有属性文件都要拷贝到新的lib中
5)在运行jar包时查看该进程使用到的dll,将这些dll保存到新的bin目录中去
5. 查看运行进程所用使用到的dll
tasklist /m >dll.txt &&dll.txt
java.exe 6376 ntdll.dll, kernel32.dll, KERNELBASE.dll,
ADVAPI32.dll, msvcrt.dll, sechost.dll,
RPCRT4.dll, jvm.dll, USER32.dll, GDI32.dll,
LPK.dll, USP10.dll, WINMM.dll, IMM32.DLL,
MSCTF.dll, verify.dll, java.dll, PSAPI.DLL,
zip.dll, swt-win32-3659.dll, ole32.dll,
OLEAUT32.dll, comdlg32.dll, SHLWAPI.dll,
COMCTL32.dll, SHELL32.dll, WININET.dll,
urlmon.dll, CRYPT32.dll, MSASN1.dll,
iertutil.dll, uxtheme.dll,
QvodExtend_x64.dll, VERSION.dll,
WS2_32.dll, NSI.dll, dwmapi.dll,
CRYPTBASE.dll, CLBCatQ.DLL
6. 结果:
我的jre中:
bin |
---
client |
--- jvm.dll
java.dll
java.exe
verify.dll
zip.dll
精简完的jre是4M多
7. 参考文章
http://yaojialing.iteye.com/blog/1067409
相关推荐
笔者精简了jre,并给出一个可用实例,笔者有一个java项目,已经对jre进行精简,制作了可执行包,从140M减到了20M,在精简jre的过程中,笔者也写了一些脚本和代码,旨在过程化该解决方案, 但是由于使用了exe4j,而...
精简jre步骤 1. 拷贝一个完整版的jre文件夹到D盘 2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. ...
Java Portable 1.8.0.181 绿色便携精简JRE, jPortable在线安装后提取版。最大化保持功能版。7z压缩后44M解压后162M。可配合便携版360极速浏览器,firefox等浏览器使用,使便携式java随时可用
制作桌面软件exe执行文件和精简jre步骤
精简JRE(windows32位和64位,linux 32位和64位)。 JRE 的精简主要是rt.jar的精简,会删除无用的class。
精简 jre 效果 程序
NULL 博文链接:https://jarg.iteye.com/blog/868287
因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是...
最新精简jre,支持swing组件,很好用的jre,只有十几兆
最近在写一个java开发的游戏,jre1.8.0_181整整有199mb,对于一个只有400多k的游戏来说,完全没必要,于是就进行精简,把jre精简到22.5mb,游戏也能正常运行。如果你急需使用精简的jre,可以下载试试。本来想精简到...
NULL 博文链接:https://jarg.iteye.com/blog/867960
精简Jre 的方案网站 包括rt的精简 精简以后出现问题的解决方案
最近在写一个小程序,jre1.8.0_181整整有199mb,对于一个只有400多k的程序来说,完全没必要,于是就进行精简,把jre精简到40M、左右,程序也能正常运行。如果你急需使用精简的jre,可以下载试试。
适合需要通过java开发桌面程序的小朋友
精简的JRE,以及用于Jar文件转exe文件的工具Jsmooth
Greenjvm_make:精简JRE神器,操作简单,只需修改make.bat即可,自动生成rt.jar
精简版jre
用pb jdbc 连接oracle10 发现classes12.jar驱动包和jre 要放在一起,一个jre 70多,太大了,我就精简了一下,附件是精简的jre 1.5 版本 和 classes12.jar驱动包,希望对大家有帮助
精简 JRE 1.6 未验证,如不必须,可以使用自己安装的jre