栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK11及其以上版本Maven打包成可运行的程序的方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK11及其以上版本Maven打包成可运行的程序的方法

Java应用的分发一直是一个比较麻烦的问题。这是因为Java应用的运行需要虚拟机的支持,仅有Java应用打包的JAR文件是不够的,目标机器还需要安装版本匹配的JDK或JRE。随着云原生和容器化技术的流行,Java应用可以选择以容器镜像的形式来打包和分发,极大地降低了分发难度。不过仍然有相当一部分的Java应用需要直接安装在客户的机器上。

通常的解决方案是使用第三方安装工具,如install4j,创建应用的安装包。安装包负责打包应用和所依赖的Java运行环境。安装工具的问题在于过于繁琐,并且通常是收费的。很多时候我们只是需要简单的运行一个Java程序而已。比如,在客户的机器上运行Java编写的数据迁移工具。

对于这样的需求,我们可以使用JDK 14中新增的Java打包工具jpackage。该工具在JDK 14和15中是预览功能,在JDK 16中已经成为正式功能。

jpackage 的基本用法

下面以JDK 16来进行说明。在JDK的bin目录下可以找到jpackage工具。jpackage可以生成平台相关的软件包:

  • Linux:deb和rpm
  • macOS:pkg和dmg
  • Windows:msi和exe

默认情况下,jpackage生成与当前运行环境相匹配的软件包。

Maven打包的pom.xml配置:

        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.9.0
                
                    18
                    18
                
            
            
            
                org.apache.maven.plugins
                maven-resources-plugin
                3.2.0
                
                    true
                    UTF-8
                
            
            
            
                org.apache.maven.plugins
                maven-jar-plugin
                3.2.2
                
                    
                        false
                        
                            true
                            lib/
                            
                            cn.ljxwtl.MainApplication
                        
                        
                            ./
                        
                    
                
            
            
                org.apache.maven.plugins
                maven-dependency-plugin
                3.3.0
                
                    
                        copy-dependencies
                        package
                        
                            copy-dependencies
                        
                        
                            jar
                            jar
                            
                            ${project.build.directory}/lib
                        
                    
                
            
        
    

打包后,会出现一下目录和文件:

自定义 JDK 镜像

默认生成的应用打包文件比较大,这是因为整个JDK中的模块都被打包了进去。可以对应用使用的JDK镜像进行定制,仅包含应用需要的模块。对于一个应用来说,整个打包过程一般分成三步来完成。

使用jdeps来输出依赖的JDK模块的名称。参数--print-module-deps的作用是输出模块名称,--ignore-missing-deps的作用是忽略模块解析的错误。

jdeps -cp "lib/*" --module-path lib --multi-release 18 --print-module-deps --ignore-missing-deps JavaFxProjWithJdk18-1.0-SNAPSHOT.jar

如果不添加参数--ignore-missing-deps,会产生很多错误,表示找不到依赖的类。这是由于Spring Boot中很多功能是可选的,这些缺失的类在运行时并不会被用到,因此不会影响应用的运行,但是会影响jdeps的检查结果。

上述命令所产生的结果如下所示:

java.base,javafx.controls,javafx.fxml

下一步是通过jlink来创建自定义的JDK镜像,如下面的代码所示。参数--add-modules中的模块列表来自jdeps命令的输出。产生的JDK镜像在目录custom-jre中。

jlink --add-modules java.base,javafx.controls,javafx.fxml --module-path lib  --output custom-jre

除了一些通用的参数之外,jpackage还可以使用平台相关的参数来定制安装包。比如,在Windows上,--win-menu可以把应用添加到启动菜单,--win-shortcut可以在桌面上创建快捷方式。macOS和Linux上也有相似的参数。

创建应用的打包文件

将JavaFxProjWithJdk18-1.0-SNAPSHOT.jar放入lib目录中后执行: 

jpackage --name simple-rest-service   --input lib --main-jar JavaFxProjWithJdk18-1.0-SNAPSHOT.jar  --runtime-image custom-jre --icon aly8j-aonoy.icns

 总得来说,jpackage在很大程度上解决了Java应用的分发问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/841896.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号