IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JDK11及其以上版本Maven打包成可运行的程序的方法 -> 正文阅读

[Java知识库]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配置:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.9.0</version>
                <configuration>
                    <source>18</source>
                    <target>18</target>
                </configuration>
            </plugin>
            <!--资源相关-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <overwrite>true</overwrite>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!--打包相关-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--指定主类,类的全限定类名-->
                            <mainClass>cn.ljxwtl.MainApplication</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>./</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <type>jar</type>
                            <includeTypes>jar</includeTypes>
                            <!--打包阶段时将依赖的jar包导出到lib目录下-->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

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

自定义 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应用的分发问题。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:33:07  更:2022-04-30 08:34:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:46:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码