项目是一个桌面程序,程序文件不大,但运行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. “全栈2019”Java异常第十六章:Throwable详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  2. [CSS3] 各种角度的三角形绘制

    #triangle-up { width:; height:; border-left: 50px solid transparent; border-right: 50px solid transp ...

  3. Jsp入门实战上

    前面讲了servlet入门实践现在开始介绍jsp入门实践,开发环境的搭建请参考我前面的tomcat的文章,jsp入门教程分为上下两部分,第一部分简单讲解:jsp语法的规范,以及三大编译指令,七个动作指 ...

  4. 【C#】自定义新建一个DataTable(3列),循环3维矩形数组往其填充数据

    从中可以了解DataTable的新增行和列;矩形多维数组循环机制;新建了DataTable DataTable dt = new DataTable(); DataColumn dc1 = new D ...

  5. django在model中添加字段报错

    在以下类中添加 description 字段后, class Colors(models.Model): colors = models.CharField(u'颜色', max_length=10) ...

  6. 阿里云 下载的 apache 证书 转换为 pcks8 证书

    第一步: 百度 搜索  rsa 转 pcks8 将 .key 文件 转换成 pcks8.key . 第二部: 将 chain.crt 的 内容 复制到 public.crt 下方.. 新的 publi ...

  7. [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析

    一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...

  8. [转] 手动上传jar包到远程仓库 (maven deploy)

    [From] https://my.oschina.net/360yg/blog/1588899 前言:通常允许上传的远程仓库有两种:Snapshots和Releases,分别为快照版仓库和稳定版仓库 ...

  9. 第1章—Spring之旅—容纳你的Bean

    容纳你的Bean 在基于Spring的应用中,你的应用对象生存于Spring容器中.Spring负责创建对象,装配他们,配置他们并管理他们整个生命周期,从生存到死亡(在这里 可能是new 到 fina ...

  10. 通过java代码给log4j指定appender

    工具代码 import org.apache.log4j.ConsoleAppender; import org.apache.log4j.LogManager; import org.apache. ...