背景:
java程序发布时需要考虑用户的运行环境是否自带了jre,如果没有则需要将jre打包发布,然而jre目录越来越大,jre7已经上百兆,这样就大大增加了程序的大小。但是jre目录中有很多文件可能是我们程序运行时不需要的,可以删除这部分文件减小程序发布的大小, 但是怎么去删除这些运行时不需要的文件呢?
思路:
删除jre中的一个文件,再执行程序,如果程序运行正常,则证明该文件可以删除,如果程序出错则恢复删除的文件。有了这个方法,我们再在这个方法上套个for循环遍历jre目录中的文件,就可以删除jre中程序运行时不需要的文件了。
实现:
/** * 清理jre路径中不需要的文件<br> * <b>@author </b>Peacenik 2013-12-28<br> * @param jrePath jre路径 */ public static void cleanJre(String jrePath) throws IOException { Files.walkFileTree(Paths.get(jrePath), new JreFileVisitor()); deleteEmptyFolder(jrePath); }
/** * jre文件访问器<br> * <b>项目名称 </b>test7<br> * <b>@author </b>Peacenik 2013-12-28<br> */ private static final class JreFileVisitor extends SimpleFileVisitor<Path> { /** * 计数器 */ private int i = 0; /* * <b>重写方法</b><br> * @see java.nio.file.SimpleFileVisitor#visitFile(java.lang.Object, java.nio.file.attribute.BasicFileAttributes) */ @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { FileVisitResult result = super.visitFile(file, attrs); tryDelete(file); return result; } /** * 更具程序执行结果判断该文件是否可删除<br> * 如果可删除,则 删除文件并返回true<br> * 如果不能删除,则返回false * <b>@author </b>Peacenik 2013-12-28<br> * @param file 文件 * @return boolean * @throws IOException */ private boolean tryDelete(Path file) throws IOException { String path = file.toFile().getPath(); Path targetPath = Paths.get(path.replaceFirst("jre", "jre_back")); // 移除文件 if (!Files.exists(targetPath.getParent())) { Files.createDirectories(targetPath.getParent()); } if (Files.exists(targetPath)) { Files.delete(targetPath); } Files.move(file, targetPath); boolean success = executeSuccess(); if (!executeSuccess()) { // 执行失败时恢复移除的文件 Files.move(targetPath, file); } System.out.println((++this.i) + "\t/\t" + success + "\t/\t" + file.toFile().getPath()); return success; } }
/** * 删除空目录<br> * <b>@author </b>Peacenik 2013-12-28<br> * @param folder 文件夹路径 */ private static void deleteEmptyFolder(String folder) throws IOException { Files.walkFileTree(Paths.get(folder), new SimpleFileVisitor<Path>() { @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { FileVisitResult result = super.postVisitDirectory(dir, exc); if (dir.toFile().list().length == 0) { Files.delete(dir); } return result; } }); }
/** * 执行程序,返回程序是否执行成功<br> * 这个方法需要根据自己的情况进行修改 * <b>@author </b>Peacenik 2013-12-28<br> * @return boolean */ public static boolean executeSuccess() { Process process = null; try { // 创建执行程序 String[] commands = new String[] { "D:/tools/exe4j/demo/mytools/test7.exe" }; File directory = new File("D:/tools/exe4j/demo/mytools/"); process = Runtime.getRuntime().exec(commands, new String[] {}, directory); process.waitFor(); byte[] bs = new byte[10]; // 读取错误信息 try (InputStream ins = process.getErrorStream()) { int length = ins.read(bs); if (length > 0) { return false; } } // 读取非错误信息 try (InputStream ins = process.getInputStream()) { int length = process.getInputStream().read(bs); if (length != 2) { return false; } } // 判断返回值 int ret = process.exitValue(); process.destroy(); return (ret == 0) && "ok".equals(new String(bs, 0, 2)); } catch (Exception e) { return false; } finally { if (process != null) { process.destroy(); } } }
补充:
rt.jar 这个jar文件有几十兆,可以视情况删除其中的部分package,也可以瘦身不少
相关推荐
自己动手精简我们jre,再打包成exe这样java程序就可以在windows下很好的运行了,而且jre体积也很小不影响下载!感兴趣的可以下载后动手精简一下你的jre,我的精简到了2M以内,做成exe后根本看不出来是java做的。里面...
笔者精简了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. ...
精简 jre 效果 程序
最近在写一个java开发的游戏,jre1.8.0_181整整有199mb,对于一个只有400多k的游戏来说,完全没必要,于是就进行精简,把jre精简到22.5mb,游戏也能正常运行。如果你急需使用精简的jre,可以下载试试。本来想精简到...
最近在写一个小程序,jre1.8.0_181整整有199mb,对于一个只有400多k的程序来说,完全没必要,于是就进行精简,把jre精简到40M、左右,程序也能正常运行。如果你急需使用精简的jre,可以下载试试。
因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是...
适合需要通过java开发桌面程序的小朋友
Java Portable 1.8.0.181 绿色便携精简JRE, jPortable在线安装后提取版。最大化保持功能版。7z压缩后44M解压后162M。可配合便携版360极速浏览器,firefox等浏览器使用,使便携式java随时可用
制作桌面软件exe执行文件和精简jre步骤
NULL 博文链接:https://jarg.iteye.com/blog/868287
精简JRE(windows32位和64位,linux 32位和64位)。 JRE 的精简主要是rt.jar的精简,会删除无用的class。
精简版jre
GreenJVMMake - CSDN下载 下载 这是一个配合GreenJVM使用的JRE精简工具,可以动态的获取应用程序中对于rt.jar的class依赖,并根据依赖关系自动构成精简后的rt.jar.
最新精简jre,支持swing组件,很好用的jre,只有十几兆
精简的JRE,以及用于Jar文件转exe文件的工具Jsmooth
制作 docker 精简 jre8 基础镜像,基础镜像为bitnami/minideb,jdk8u321版本,已解决httpclient中文乱码和webservice-client缺包问题。
NULL 博文链接:https://geek41.iteye.com/blog/1183836
最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre最精简的jre
超级精简版的jre,超级精简版的jre,超级精简版的jre,超级精简版的jre