项目是一个桌面程序,程序文件不大,但运行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. 详解sizeof与strlen

    一,sizeof是C语言的一种单目运算符,与C语言的其他运算符++,--一样,它并不是函数:sizeof()以字节为单位给出了操作数的大小:sizeof的值是无符号int. strlen是一个函数,只 ...

  2. JavaScript求数组Array的并集(javascript面试常见题目)

    var Utils = { joinArray:function(source,target){ for(var i = 0;i<source.length;i++){ var oa = sou ...

  3. docker 实例设置自动重启

    yaml格式太严格了,每个冒号后面都必须带有空格在linux中./代表当前目录,属于相对路径../代表上一级目录,属于相对路径/代表根目录,/开头的文件都是绝对路径./configure的意思是执行当 ...

  4. JSP常用Form表单控件

    [easyui]--combobox--赋值和获取选中的值 /初始化下拉选框 $('#communityIdDiv').combobox({ url:basepath+"pushContro ...

  5. MySQL数据库管理

    好记性不如烂笔头 1.MySQL启动基本原理 /etc/init.d/mysqld 是一个shell启动脚本,启动后会调用mysqld_safe脚本,最后调用的是mysqld主程序启动mysql. 单 ...

  6. 爬虫之chrome浏览器的使用方法

    chrome浏览器使用方法介绍 1. 新建隐身窗口 1.1 为什么需要新建隐身窗口 在打开隐身窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,不携带cookie.这样就 ...

  7. js 弹性导航

    <style> *{margin:0;padding:0;} #box{height:50px;float:left;position:relative;background:#f90;} ...

  8. Mac服务管理-Launchd(转)

    背景: 在Mac下没有像Linux那样有很多的关于init方面的工具,从init的发展历史https://en.wikipedia.org/wiki/Init上可以知道,Mac使用的是Launchd作 ...

  9. (转)分布式中使用Redis实现Session共享(一)

    上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇 ...

  10. 关于c#中”ref”和”out”关键字的一些理解

    一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正) 在c#中,方法的参数传递有四种类型: (1) 传值参数(by value) 传值参数无需额外的修饰符.传 ...