项目是一个桌面程序,程序文件不大,但运行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系统变量指定的路径中类库。

关于类加载器:

http://www.cnblogs.com/doit8791/p/5820037.html

因此将程序依赖的jar包都copy到精简后的jre下的ext目录下。

但是随之而来出现了配置文件无法读取的错误,解决办法:将配置文件打成jar包copy到ext目录下。

问题产生原因:双亲委托模式。

5、生成exe程序

用exe4j工具将项目生成exe程序,程序集成了精简版jre,程序和jre总大小为69.9 MB。

JRE“瘦身”&桌面程序集成JRE的更多相关文章

  1. 整理JRE瘦身或精简JRE

    http://blog.csdn.net/xiaoping8411/article/details/6973887 版权声明:本文为博主原创文章,未经博主允许不得转载. 前不久给朋友做了一个桌面程序, ...

  2. .NET桌面程序集成Web网页开发的多种解决方案

    系列目录     [已更新最新开发文章,点击查看详细] B/S架构的Web程序几乎占据了应用软件的绝大多数市场,但是C/S架构的WinForm.WPF客户端程序依然具有很实用的价值,如设计类软件 Au ...

  3. Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云

    alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...

  4. 一个更好用的.NET Core程序瘦身器,减小程序尺寸到1/3

    一.为什么要开发.NET Core程序瘦身器? .NET Core具有[剪裁未使用的代码]的功能,但是由于它是使用静态分析来实现的,因此它的剪裁效果并不是最优的.它有如下两个缺点: 不支持Window ...

  5. .NET跨平台实践:Linux .Net Core自宿主应用程序瘦身记

    一,.NET Core 自宿主应用程序个头很大 发布.NET Core应用程序有两个方式,一种是“便携式”,一种是“自宿主式”.便携式发布时,目标程序不带.net core运行环境,所以“个头”很小, ...

  6. Windows Java桌面应用程序集成slf4j实现日志持久化

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 Windows上一般的应用程序也可以通过日志系统打印日志到指定文件.通过这个例子想说明,问题处理的方法是多 ...

  7. APK瘦身实践

    首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...

  8. Android APK 瘦身 - JOOX Music项目实战

    导语 JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存 ...

  9. iOS安装包瘦身的那些事儿

    在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...

随机推荐

  1. @media媒体查询

    @media媒体查询 @media screen and (min-width:640px) and (max-width:1920px){/*当屏幕尺寸大于640px时与小于1920时*/ .pub ...

  2. P4016 负载平衡问题 网络流

    P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运 ...

  3. 关于字典的几个类--defaultdict,OrderedDict, zip()

    一.  1个键对应多个值 比如:d = {'a' : [1, 2, 3],  'b' : [4, 5]},可以使用 collections 模块中的 defaultdict 来构造这样的字典 from ...

  4. 4.1.1 Choosing the SST Donor

    摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...

  5. leetcode-374-Guess Number Higher or Lower(二分查找)

    题目描述: We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have t ...

  6. 【Quartz】Spring Boot使用properties文件配置Quartz

    (1)在resource目录下新建quartz.properties文件 #============================================================== ...

  7. 题目1002:Grading(简单判断)

    问题来源 http://ac.jobdu.com/problem.php?pid=1002 问题描述 题目背景为高考试卷批改打分制度.对于每一道题,至少需要两位评审老师进行打分, 当两个老师的打分结果 ...

  8. [原创]php任务调度器 hellogerard/jobby

    目录 简介 安装 标准使用 选项 项目实践 简介 一个强大的php层面上的定时任务调度器, 无需修改系统层面的crontab 实际中, php 结合 crontab 来实现定时任务是一种经得住考验的实 ...

  9. php 前台生成多维数组 后台批量添加

    同一个地方绊倒两次,记录一下哈 1)前台表单,看 name <div class="tab-pane row " id="tab-1" > < ...

  10. java io 处理流,BufferdInputStream、BufferedWriter、BufferedReader

    BufferdInputStream:读取helloworld.java helloworld.java: package io; public class HelloWorld { public s ...