引言
我的项目设置关闭显示器时间的工程中https://gitee.com/wallwamusic/customset-moitortime,项目打包为jar以后,作为一个客户端程序,显然直接使用JDK是不合适的,太大了。所以使用JDK11制作一个JRE就行了,根据自己的项目需要制作一个即可。
构建JRE的基础
高版本JDK目前都是模块化的,模块化的好处在打包JRE的时候好处就体现出来了,可以根据项目工程使用的JDK模块制作项目需要的JRE,打包一个最小项目运行JRE,这样可以减小JAVA应用程序的大小。
具体的话,高版本的JDK提供扫描JAR包使用的依赖模块工具jdeps,在高版本的JDK安装目录的bin目录下。可以使用jdeps扫描项目对应的jar包,然后使用jlink依据jdeps打印输出的模块制作JRE。
实操制作JRE11
以我的项目,设置关闭显示器时间的工程https://gitee.com/wallwamusic/customset-moitortime为例。
首先需要进行项目打包。这个项目我采用gradle进行依赖管理、编译构建(使用maven也是可以的)。在build.gradle文件中,我定义了一个task任务copyJars,使用这个任务可以项目打包,这个任务会把项目依赖的jar包抽离出来,放到build/libs/lib文件中,我不是很喜欢fatjar的方式进行打包。还修改了jar任务,在这个任务中,主要是配置了打包产物manifest文件的属性,定义主类,启动类的,以及一些其他信息。
task copyJars(type: Copy) {
dependsOn(build)
from configurations.runtimeClasspath
into 'build/libs/lib'
}
jar {
manifest {
attributes("Main-Class": "com.codelink.MoitorTimeMainApplication")
attributes("Class-Path": getStrClassPath())
attributes("Auth": "lihaojie")
attributes("packingtime": new Date())
}
}
接下来进行操作
项目打包为JAR包
由于此项目我的编程环境必须是windows啦,并且是以wrapper包的方式的使用的gradle。因此有两种方式,一种方式是通过window终端命令行方式进行打包,一种是使用jetbrains idea打包。
第一种方式演示,在工程项目目录下使用cmd输入以下命令执行,执行以后,打包产物就会输出到build/libs文件夹下
./gradlew clean jar copyJars
第二种方式是使用idea,可视化操作,使用idea提供的gradle操作项,进行操作,也是可以操作打包的
使用jdeps确定项目JAR包依赖模块
打包完毕以后,即可根据打包产物制作项目最小化运行JRE了。在build/libs目录下,使用jdeps执行相关命令,需要配置好jdk环境变量,不让就要使用全路径来进行操作了。输出结果就是项目jar运行所需要的jdk模块。
jdeps -q --multi-release 11 --ignore-missing-deps --print-module-deps lib/*.jar customset-moitortime-1.0.jar
使用jlink根据项目依赖模块信息制作JRE
然后使用jlink制作jre,去jdk的安装目录下,执行下面的命令–add-modules后面跟上我们使用jdeps扫描得到的依赖模块即可,这时候项目运行jre11就制作好了。
./bin/jlink.exe --module-path jmods --add-modules java.base,java.desktop,java.logging,java.naming --output jre