欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JRE“瘦身”&桌面程序集成JRE

程序员文章站 2022-05-25 17:16:39
项目是一个桌面程序,程序文件不大,但运行jre有198 MB,因此需要“瘦身”。 jre包含bin、lib两部分,分别为93.6 MB、104 MB。 1、精简bin 运行桌面程序,进入bin目录,删除所有能删的;删完之后重新运行,直到正常运行。 过程中发现server目录下的classes.jsa ......

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

参考 得到精简后的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插件的

            <plugin>
                <artifactid>maven-assembly-plugin</artifactid>
                <configuration>
                    <appendassemblyid>false</appendassemblyid>
                    <descriptorrefs>
                        <descriptorref>jar-with-dependencies</descriptorref>
                    </descriptorrefs>
                    ...
                </configuration>
                ...
            </plugin>

会将所有依赖都解压打包到生成物中。这种方式生成的jar包较大,17.9 mb。

(2)采用

            <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资源打包

官方文档:

(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。