`
peacenik
  • 浏览: 5296 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

自己动手精简jre

阅读更多

背景:

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到做小

    自己动手精简我们jre,再打包成exe这样java程序就可以在windows下很好的运行了,而且jre体积也很小不影响下载!感兴趣的可以下载后动手精简一下你的jre,我的精简到了2M以内,做成exe后根本看不出来是java做的。里面...

    精简jre步骤 迷你jre制作过程

    精简jre步骤 1. 拷贝一个完整版的jre文件夹到D盘 2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. ...

    精简JRE - 实例Swing计算器 with 精简JRE

    标题 "精简JRE - 实例Swing计算器 with 精简JRE" 提供了两个主要知识点:一是关于Java的精简版运行时环境(JRE),另一个是使用Swing构建的计算器应用。 1. **精简JRE**: Java运行时环境(JRE)是执行Java应用...

    精简的jre和精简过程

    最近在写一个小程序,jre1.8.0_181整整有199mb,对于一个只有400多k的程序来说,完全没必要,于是就进行精简,把jre精简到40M、左右,程序也能正常运行。如果你急需使用精简的jre,可以下载试试。

    精简版jre.zip 64位 1.8.0压缩后才20M

    本"精简版jre.zip"是专为64位操作系统设计的1.8.0版本,其经过优化和裁剪,体积仅有20MB,相较于官方完整版JRE,大大减少了存储空间的需求,对于那些只需要运行Java桌面程序而无需进行开发工作的小朋友们来说,这是...

    exe4j+精简jre实例

    笔者精简了jre,并给出一个可用实例,笔者有一个java项目,已经对jre进行精简,制作了可执行包,从140M减到了20M,在精简jre的过程中,笔者也写了一些脚本和代码,旨在过程化该解决方案, 但是由于使用了exe4j,而...

    精简JRE(windows32位和64位,linux 32位和64位)

    这个压缩包"jre7精简"很可能包含以上所述的各个精简后的JRE版本,用户可以根据自己的操作系统和需求选择合适的文件进行安装。在部署时,精简版JRE可以更快地启动,占用更少的磁盘空间,特别适合于资源有限或者对性能...

    精简 jre 效果程序

    "精简 jre 效果程序"这个主题指的是对标准的JRE进行优化和裁剪,以减少其体积,提高运行效率或适应特定的系统需求。 1. **JRE组成部分**: JRE主要由以下几个部分组成: - Java虚拟机(JVM):负责解释并执行Java...

    JRE瘦身 jre减肥 精简jre jre精简

    因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是...

    精简版jre1.8(wins 64位,附压缩教程)

    最近在写一个java开发的游戏,jre1.8.0_181整整有199mb,对于一个只有400多k的游戏来说,完全没必要,于是就进行精简,把jre精简到22.5mb,游戏也能正常运行。如果你急需使用精简的jre,可以下载试试。本来想精简到...

    精简JRE第二步 ─ 精简lib目录

    然而,标准的JRE安装包相对较大,对于某些只需要特定功能的应用场景,如服务器部署、嵌入式系统或者物联网设备,精简JRE可以有效地减小资源占用,提高运行效率。本篇文章将深入探讨如何精简JRE中的"lib"目录,以满足...

    超级精简版的jre

    标题中的"超级精简版的jre"指的是对标准JRE进行优化和裁剪,移除了不必要的组件和服务,以实现更小的体积、更快的启动速度以及更低的资源消耗。 精简版JRE通常是为了满足特定应用场景的需求,比如嵌入式设备、低...

    精简版本jre

    "精简版JRE"是为了满足特定需求而定制的一个轻量级版本,它去除了标准JRE中的一些非必需组件,以减小体积,提高运行速度,降低系统资源消耗。 精简版JRE的主要特点: 1. **体积小巧**:相比完整版JRE,精简版删除...

    精简jre最新版

    "精简jre最新版"指的是针对Java运行环境的一个轻量级版本,这个版本进行了优化,删除了一些不必要的组件,以减小安装包的大小。在描述中提到,它支持Swing组件,这意味着用户依然可以使用Java的图形用户界面(GUI)...

    制作桌面软件exe执行文件和精简jre步骤.zip

    本教程主要聚焦于如何制作桌面软件的exe执行文件,并精简Java运行环境(JRE)的过程,这对于提高软件的便携性和降低用户系统资源占用至关重要。 一、制作exe执行文件 1. 使用Java打包工具:Java应用程序通常以jar...

    精简Jre和Jsmooth

    "精简JRE"通常指的是为了减少安装体积、提高运行速度或者针对特定应用需求而定制的JRE版本。这种定制化的过程可能包括移除不必要或冗余的库、插件和服务,使得JRE更加轻量化,适用于那些对系统资源有限制或有特定...

    Java Portable 1.8.0.181 绿色便携精简JRE & JDK &

    Java Portable 1.8.0.181 绿色便携精简JRE, jPortable在线安装后提取版。最大化保持功能版。7z压缩后44M解压后162M。可配合便携版360极速浏览器,firefox等浏览器使用,使便携式java随时可用

    Jre8精简基础镜像包

    制作 docker 精简 jre8 基础镜像,基础镜像为bitnami/minideb,jdk8u321版本,已解决httpclient中文乱码和webservice-client缺包问题。

    精简的jre的精简工具

    GreenJVMMake - CSDN下载 下载 这是一个配合GreenJVM使用的JRE精简工具,可以动态的获取应用程序中对于rt.jar的class依赖,并根据依赖关系自动构成精简后的rt.jar.

    jre1.8 64位精简精版.zip

    标题提到的是"jre1.8 64位精简精版.zip",这意味着这是一个针对64位操作系统的Java 1.8运行环境的轻量化版本。描述中指出,原始的JRE 1.8大小约为160MB,而经过精简处理后,体积减小到80MB,压缩后的zip文件更是压缩...

Global site tag (gtag.js) - Google Analytics