项目是一个桌面程序,程序文件不大,但运行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。

最新文章

  1. C#调用RAR压缩与解压
  2. mac 系统通用快捷键(mac 下的应用多数会往这些标准看齐)(转:http://yang3wei.github.io/blog/2013/02/08/chen-ni-yu-mac-chen-ni-yu-xcode/)
  3. ftp 操作,支持断点续传或者继续下载。
  4. .NET开源工作流RoadFlow-流程设计-流程步骤设置-按钮设置
  5. Android中如何获取应用版本号
  6. 关于CStdioFile的使用问题
  7. Executing Raw SQL Queries using Entity Framework
  8. python_形参何时影响实参
  9. 2018年多校第三场第一题 A. Ascending Rating hdu6319
  10. Spring Boot 学习之路二 配置文件 application.yml
  11. systemd: Started Session 305 of user root.
  12. Git 日常操作
  13. 个人练习:使用HTML+CSS制作二级菜单
  14. 机器学习算法总结(三)——集成学习(Adaboost、RandomForest)
  15. MSSQL 2012 密钥
  16. Parallax Mapping
  17. 【牛客OI赛制测试赛3】 毒瘤xor
  18. 【干货】国外程序员整理的 C++ 资源大全(转)
  19. Hibernate之mappedBy与@JoinColumn
  20. SnapKit 类图

热门文章

  1. Django 项目拆分配置文件settings.py
  2. Python FLask Web 学习笔记:jinjia2的使用方法1
  3. 替代iframe新逻辑
  4. SQL中DateTime转换成Varchar样式
  5. c++之随堂笔记
  6. 2016级算法第六次上机-A.Bamboo之寻找小金刚
  7. css的reset和常用的html标签的默认样式整理
  8. dotnet core webapi +vue 搭建前后端完全分离web架构(一)
  9. 开源前夕先给大家欣赏一下我用C语言开发的云贴吧 网站自动兼容-移动、手机、PC自动兼容云贴吧
  10. js小技巧--摘录1