JRE“瘦身”&桌面程序集成JRE
项目是一个桌面程序,程序文件不大,但运行jre有198 MB,因此需要“瘦身”。
jre包含bin、lib两部分,分别为93.6 MB、104 MB。
1、精简bin
运行桌面程序,进入bin目录,删除所有能删的;删完之后重新运行,直到正常运行。
过程中发现server目录下的classes.jsa是18.3 MB,删除后程序正常运行。
精简后bin为11.1 MB。
2、精简lib
发现rt.jar包大小60.6 MB,因此首先精简rt.jar包。
精简rt.jar主要步骤如下:
(1)提取我们需要的类库
借助JDK1.8提供的Java类依赖性分析器jdeps,分析Java类文件的包级或类级依赖关系。
命令如下:
jdeps -v -dotoutput dot C:\test\syncapplets-1.0-SNAPSHOT.jar
输出到 “C:\Users\李帅” 目录下,生成名为“dot”的目录,dot目录下有summary.dot、syncapplets-1.0-SNAPSHOT.jar.dot两个文件。
syncapplets-1.0-SNAPSHOT.jar.dot文件部分内容如下:
digraph "syncapplets-1.0-SNAPSHOT.jar" {
// Path: C:\Users\李帅\Desktop\huayuan_applicate\syncapplets-1.0-SNAPSHOT.jar
"com.github.pagehelper.Dialect" -> "java.lang.Object";
"com.github.pagehelper.Dialect" -> "java.lang.String";
"com.github.pagehelper.Dialect" -> "java.util.List";
"com.github.pagehelper.Dialect" -> "java.util.Properties";
...
参考 https://blog.csdn.net/u013287852/article/details/82596276 得到精简后的rt.jar,大小为4M;但很遗憾程序运行失败。
因此采用第二种办法。
(2)继续精简rt.jar
解压rt.jar,再逐个删除里边的文件,然后再打成jar包替换原来的rt.jar,重启程序,多次试验后得到精简版rt.jar,大小29.3 MB。
(3)精简lib中其他文件
用类似的方法删除不必要的jar包和文件,包括ext目录下的jar包。
精简后lib为38.7MB。
3、桌面程序瘦身
(1)pom文件中maven-assembly-plugin插件的 属性是jar-with-dependencies:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
...
</configuration>
...
</plugin>
会将所有依赖都解压打包到生成物中。这种方式生成的jar包较大,17.9 MB。
(2)采用 的src属性方式:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>src</descriptorRef>
</descriptorRefs>
...
</configuration>
...
</plugin>
这种方式生成的jar包大小只有77.6 KB 。
默认情况下,maven-assembly-plugin内置了几个可以用的assembly descriptor:
- bin : 类似于默认打包,会将bin目录下的文件打到包中
- jar-with-dependencies : 会将所有依赖都解压打包到生成物中
- src :只将源码目录下的文件打包
- project : 将整个project资源打包
官方文档:
http://maven.apache.org/components/plugins/maven-assembly-plugin/
http://maven.apache.org/components/plugins/maven-assembly-plugin/descriptor-refs.html
(3)maven-dependency-plugin插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
outputDirectory: 指定拷贝项目依赖包的存放位置。
4、桌面程序集成jre
ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。
关于类加载器:
因此将程序依赖的jar包都copy到精简后的jre下的ext目录下。
但是随之而来出现了配置文件无法读取的错误,解决办法:将配置文件打成jar包copy到ext目录下。
问题产生原因:双亲委托模式。
5、生成exe程序
用exe4j工具将项目生成exe程序,程序集成了精简版jre,程序和jre总大小为69.9 MB。
JRE“瘦身”&桌面程序集成JRE的更多相关文章
- 整理JRE瘦身或精简JRE
http://blog.csdn.net/xiaoping8411/article/details/6973887 版权声明:本文为博主原创文章,未经博主允许不得转载. 前不久给朋友做了一个桌面程序, ...
- .NET桌面程序集成Web网页开发的多种解决方案
系列目录 [已更新最新开发文章,点击查看详细] B/S架构的Web程序几乎占据了应用软件的绝大多数市场,但是C/S架构的WinForm.WPF客户端程序依然具有很实用的价值,如设计类软件 Au ...
- Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云
alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...
- 一个更好用的.NET Core程序瘦身器,减小程序尺寸到1/3
一.为什么要开发.NET Core程序瘦身器? .NET Core具有[剪裁未使用的代码]的功能,但是由于它是使用静态分析来实现的,因此它的剪裁效果并不是最优的.它有如下两个缺点: 不支持Window ...
- .NET跨平台实践:Linux .Net Core自宿主应用程序瘦身记
一,.NET Core 自宿主应用程序个头很大 发布.NET Core应用程序有两个方式,一种是“便携式”,一种是“自宿主式”.便携式发布时,目标程序不带.net core运行环境,所以“个头”很小, ...
- Windows Java桌面应用程序集成slf4j实现日志持久化
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 Windows上一般的应用程序也可以通过日志系统打印日志到指定文件.通过这个例子想说明,问题处理的方法是多 ...
- APK瘦身实践
首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...
- Android APK 瘦身 - JOOX Music项目实战
导语 JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存 ...
- iOS安装包瘦身的那些事儿
在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...
随机推荐
- docker的介绍以及常用命令
一.docker的介绍 1. Docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚 ...
- [转载] cassandra Unable to complete request: one or more nodes were unavailable
今天碰到的问题跟这个一模一样,特地转过来记录一下 https://support.datastax.com/hc/en-us/articles/204893189-CQL-query-results- ...
- 空行会影响 Java 编译吗?
简评:往往越简单的问题越容易被人们忽略. 问题 这个月的 Stack Overflow 有篇热门文章是国外有位开发者提出: 当我仅仅对 Java 类增加了一行空行,为什么编译后得到了两个不同的字节码文 ...
- Scrum Meeting 汇总
Alpha [Alpha]Scrum Meeting 0&1 [Alpha]Scrum Meeting 2 [Alpha]Scrum Meeting 3 [Alpha]Scrum Meetin ...
- ftpClient.retrieveFileStream导致FTPClient的后面操作失败
问题代码: FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName ...
- 用Python写了一个postgresql函数,感觉很爽
用Python写了一个postgresql函数,感觉很爽 CREATE LANGUAGE plpythonu; postgresql函数 CREATE OR REPLACE FUNCTION myfu ...
- webpack原理探究 && 打包优化
在做vue项目和react项目时,都用到了webpack.webpack帮助我们很好地提高了工作效率,但是一直以来没有对其原理进行探究,略有遗憾. 因为使用一个工具,能够深入了解其原理才能更好地使用. ...
- 通过System获取java环境变量的路径
通过System获取java环境变量的路径代码为: import java.io.FileNotFoundException; import java.io.FileOutputStream; imp ...
- Idea查看代码相关技巧
(1)查看类中的属性与方法快捷键 Alt+7 (2)查看方法被调用 在方法上右键find usages (3)查看方法说明 Ctrl+Q
- 关于Java 下 Snappy压缩存文件
坑点: 压缩后的byte 数组中会有元素是负数,如果转化成String 存入文件,然后再读取解压缩还原,无法得到原来的结果,甚至是无法解压缩. 原因分析: String 底层是由char 数组构成的, ...