zoukankan      html  css  js  c++  java
  • JRE“瘦身”&桌面程序集成JRE

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

  • 相关阅读:
    经典面试题之——如何自由转换两个没有继承关系的字段及类型相同的实体模型,AutoMapper?
    MySQL高效分页-mybatis插件PageHelper改进
    bat/cmd批处理程序设计教程
    除法与模运算的识别-大量除法推导过程
    进程 线程 协程的相关理解
    音素音标
    如何免费的让网站启用HTTPS
    破解笔记
    Linux的.a、.so和.o文件 对比 window下的dll,lib,exe文件
    注册表启动的位置
  • 原文地址:https://www.cnblogs.com/pianistedward/p/10018954.html
Copyright © 2011-2022 走看看