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步骤 1. 拷贝一个完整版的jre文件夹到D盘 2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. ...
标题 "精简JRE - 实例Swing计算器 with 精简JRE" 提供了两个主要知识点:一是关于Java的精简版运行时环境(JRE),另一个是使用Swing构建的计算器应用。 1. **精简JRE**: Java运行时环境(JRE)是执行Java应用...
精简JRE的主要目的是减少安装包的大小,提高下载和部署的效率,同时降低运行时的内存占用。在JRE中,rt.jar是最核心的库文件,包含了Java标准类库的所有类。通过对rt.jar进行精简,可以移除那些不常用或者特定应用...
笔者精简了jre,并给出一个可用实例,笔者有一个java项目,已经对jre进行精简,制作了可执行包,从140M减到了20M,在精简jre的过程中,笔者也写了一些脚本和代码,旨在过程化该解决方案, 但是由于使用了exe4j,而...
在IT领域,特别是Java开发中,经常需要将应用程序...总结,将Java应用程序转化为exe并精简JRE,既方便了用户,也优化了软件性能。通过使用恰当的工具和方法,可以实现这一目标,同时需要注意各种技术细节和合规问题。
然而,标准的JRE安装包相对较大,对于某些只需要特定功能的应用场景,如服务器部署、嵌入式系统或者物联网设备,精简JRE可以有效地减小资源占用,提高运行效率。本篇文章将深入探讨如何精简JRE中的"lib"目录,以满足...
Java Portable 1.8.0.181 绿色便携精简JRE, jPortable在线安装后提取版。最大化保持功能版。7z压缩后44M解压后162M。可配合便携版360极速浏览器,firefox等浏览器使用,使便携式java随时可用
- **定制需求**:某些应用可能只需要特定的Java功能,精简JRE可以只包含这些必要的部分。 - **安全性**:减少不必要的组件可以降低潜在的安全风险。 3. **精简方法**: - **选择性安装**:通过定制安装,仅安装...
"精简JRE"通常指的是为了减少安装体积、提高运行速度或者针对特定应用需求而定制的JRE版本。这种定制化的过程可能包括移除不必要或冗余的库、插件和服务,使得JRE更加轻量化,适用于那些对系统资源有限制或有特定...
"精简jre最新版"指的是针对Java运行环境的一个轻量级版本,这个版本进行了优化,删除了一些不必要的组件,以减小安装包的大小。在描述中提到,它支持Swing组件,这意味着用户依然可以使用Java的图形用户界面(GUI)...
【标题】"精简jre的利器autojar"所涉及的知识点主要集中在Java应用程序的部署和优化上。Autojar是一款非常实用的工具,主要用于自动化Java应用程序的打包过程,特别是对于那些需要精简JRE(Java运行环境)的项目,它...
精简JRE(Java Runtime Environment)方案主要针对的是在特定应用环境下对标准JRE进行裁剪,以减小其体积、提升启动速度或减少资源占用等目的。这种做法尤其适用于嵌入式系统、移动设备或其他资源受限的环境。本文将...
因此,“精简JRE”成为了一个优化和减小JRE体积的有效方法。本篇将详细介绍如何精简JRE中的“bin”目录,以适应特定需求。 “bin”目录是JRE的核心部分,包含了Java虚拟机(JVM)、Java命令行工具和其他必要的可...
最近在写一个小程序,jre1.8.0_181整整有199mb,对于一个只有400多k的程序来说,完全没必要,于是就进行精简,把jre精简到40M、左右,程序也能正常运行。如果你急需使用精简的jre,可以下载试试。
本篇内容将深入探讨如何精简JRE并使用verbose命令来获取运行时的详细信息。 首先,精简JRE是为了减小Java运行环境的体积,以适应不同的应用场景,例如嵌入式设备、物联网设备或云服务等。精简JRE通常包括删除不必要...
因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是...
【标题】"Greenjvm_make 精简JRE"是一个专为Java开发人员设计的工具,用于定制和优化Java运行时环境(JRE)。它简化了从标准JRE中剔除不必要的库和组件的过程,使得JRE体积更小,更适合特定的应用场景,从而提高应用...