javafx jlink 遇到的非模块化的依赖打包报错“模块异常”的问题和处理 ...

科技颠覆者  金牌会员 | 2024-9-19 23:13:40 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 679|帖子 679|积分 2037

javafx jlink 遇到的问题和处理

简介

javafx:jlink 是 javafx-maven-plugin 插件中的一个目标,用于创建一个自包含的 JavaFX 应用程序运行时映像。这个目标利用 Java 的 jlink 工具来天生一个包含应用程序及其所有依赖的定制化运行时映像,从而简化摆设和分发。

  • 创建自包含运行时:通过 jlink 创建一个定制的 Java 运行时环境(JRE),只包含应用程序所需的模块和依赖。这可以减少最终摆设包的大小。
  • 模块化:与传统的 JRE 相比,天生的运行时映像是模块化的,只包含你的应用程序实际需要的 Java 模块。
  • 简化摆设:可以将天生的运行时映像作为最终用户的运行环境,减少对体系环境的依赖。
打包遇到非模块依赖时的处理

一般 javafx:jilink 打包需要依赖的项目都是模块化的,然后使用插件 javafx-maven-plugin进行 javafx:jlink 一键打包
  1. <plugin>
  2.     <groupId>org.openjfx</groupId>
  3.     <artifactId>javafx-maven-plugin</artifactId>
  4.     <version>0.0.8</version>
  5.     <configuration>
  6.         <stripDebug>true</stripDebug>
  7.         <compress>2</compress>
  8.         <noHeaderFiles>true</noHeaderFiles>
  9.         <noManPages>true</noManPages>
  10.         <launcher>FxExample</launcher>
  11.         <jlinkImageName>FxExample</jlinkImageName>
  12.         <jlinkZipName>FxExampleZip</jlinkZipName>
  13.         <mainClass>com.xxx.xxx.FxExampleApp</mainClass>
  14.     </configuration>
  15. </plugin>
复制代码
但是总会有那种没有模块化的依赖,好比说 hutool 包,默认是没有模块化的,这个时候就需要自行补全这个模块化的信息
起首在仓库中找到所有依赖的没有模块化的包,我这里用 hutool 举例子
我的项目依赖了(其中 setting 依赖了 log 和 core)
  1. hutool-core-5.8.29.jar
  2. hutool-json-5.8.29.jar
  3. hutool-setting-5.8.29.jar
  4. hutool-log-5.8.29.jar
复制代码
准备临时编译目次

新建一个临时的空的 maven 项目,或者一个空文件夹,我这里为了方便,使用的空的 maven 项目
将依赖的 jar 复制到项目中,从控制台 cd 到项目路径
在项目路径下面为每个 jar 天生 module-info.java
  1. # 使用jdk自带的工具扫描自动生成module-info.java
  2. jdeps --ignore-missing-deps --generate-module-info . *.jar
复制代码
日志
  1. Warning: --ignore-missing-deps specified. Missing dependencies from cn.hutool.setting are ignored
  2. writing to .\cn.hutool.setting\module-info.java
  3. writing to .\cn.hutool.json\module-info.java
  4. Warning: --ignore-missing-deps specified. Missing dependencies from cn.hutool.core are ignored
  5. writing to .\cn.hutool.core\module-info.java
复制代码
天生的内容好比 cn.hutool.core/module-info.java
这里发起直接将整个 module open 了,方便反射机制的调用,还有如果遇到需要 uses 的接口,也需要加到模块信息中,不然后续打完包运行过程遇到对应的类,照旧会报模块没有设置某个类的 uses 信息,以下是我根据我的环境修改了内容的 module-info
  1. open module cn.hutool.core {
  2.     requires java.management;
  3.     requires transitive java.compiler;
  4.     requires transitive java.datatransfer;
  5.     requires transitive java.desktop;
  6.     requires transitive java.naming;
  7.     requires transitive java.sql;
  8.     requires transitive java.xml;
  9.     uses cn.hutool.core.convert.Converter;
  10.     uses cn.hutool.core.convert.TypeConverter;
  11.     exports cn.hutool.core.annotation.scanner;
  12.     exports cn.hutool.core.annotation;
  13.     exports cn.hutool.core.bean.copier.provider;
  14.     exports cn.hutool.core.bean.copier;
  15.     exports cn.hutool.core.bean;
  16.     exports cn.hutool.core.builder;
  17.     exports cn.hutool.core.clone;
  18.     exports cn.hutool.core.codec;
  19.     exports cn.hutool.core.collection;
  20.     exports cn.hutool.core.comparator;
  21.     exports cn.hutool.core.compiler;
  22.     exports cn.hutool.core.compress;
  23.     exports cn.hutool.core.convert.impl;
  24.     exports cn.hutool.core.convert;
  25.     exports cn.hutool.core.date.chinese;
  26.     exports cn.hutool.core.date.format;
  27.     exports cn.hutool.core.date;
  28.     exports cn.hutool.core.exceptions;
  29.     exports cn.hutool.core.getter;
  30.     exports cn.hutool.core.img.gif;
  31.     exports cn.hutool.core.img;
  32.     exports cn.hutool.core.io.checksum.crc16;
  33.     exports cn.hutool.core.io.checksum;
  34.     exports cn.hutool.core.io.copy;
  35.     exports cn.hutool.core.io.file.visitor;
  36.     exports cn.hutool.core.io.file;
  37.     exports cn.hutool.core.io.resource;
  38.     exports cn.hutool.core.io.unit;
  39.     exports cn.hutool.core.io.watch.watchers;
  40.     exports cn.hutool.core.io.watch;
  41.     exports cn.hutool.core.io;
  42.     exports cn.hutool.core.lang.ansi;
  43.     exports cn.hutool.core.lang.caller;
  44.     exports cn.hutool.core.lang.copier;
  45.     exports cn.hutool.core.lang.func;
  46.     exports cn.hutool.core.lang.generator;
  47.     exports cn.hutool.core.lang.hash;
  48.     exports cn.hutool.core.lang.id;
  49.     exports cn.hutool.core.lang.intern;
  50.     exports cn.hutool.core.lang.loader;
  51.     exports cn.hutool.core.lang.mutable;
  52.     exports cn.hutool.core.lang.reflect;
  53.     exports cn.hutool.core.lang.tree.parser;
  54.     exports cn.hutool.core.lang.tree;
  55.     exports cn.hutool.core.lang;
  56.     exports cn.hutool.core.map.multi;
  57.     exports cn.hutool.core.map;
  58.     exports cn.hutool.core.math;
  59.     exports cn.hutool.core.net.multipart;
  60.     exports cn.hutool.core.net.url;
  61.     exports cn.hutool.core.net;
  62.     exports cn.hutool.core.stream;
  63.     exports cn.hutool.core.swing.clipboard;
  64.     exports cn.hutool.core.swing;
  65.     exports cn.hutool.core.text.csv;
  66.     exports cn.hutool.core.text.escape;
  67.     exports cn.hutool.core.text.finder;
  68.     exports cn.hutool.core.text.replacer;
  69.     exports cn.hutool.core.text.split;
  70.     exports cn.hutool.core.text;
  71.     exports cn.hutool.core.thread.lock;
  72.     exports cn.hutool.core.thread.threadlocal;
  73.     exports cn.hutool.core.thread;
  74.     exports cn.hutool.core.util;
  75. }
复制代码
编译 module-info.java 为 module-info.class 并且注入 module-info.class 到 jar

这里需要注意一下编译的顺序,对于 hutool-core 模块来说,它没有其他的依赖模块,可以先直接编译这个模块
  1. # 生成module-info.class
  2. javac --patch-module cn.hutool.core=hutool-core-5.8.29.jar cn.hutool.core/module-info.java
  3. # 注入module-info.class到jar
  4. jar uf hutool-core-5.8.29.jar -C cn.hutool.core module-info.class
复制代码
其他模块编译和注入(增长-p 来引入依赖的模块)
  1. javac --patch-module cn.hutool.core=hutool-core-5.8.29.jar cn.hutool.core/module-info.java
  2. jar uf hutool-core-5.8.29.jar -C cn.hutool.core module-info.class
  3. javac -p hutool-core-5.8.29.jar --patch-module cn.hutool.json=hutool-json-5.8.29.jar cn.hutool.json/module-info.java
  4. jar uf hutool-json-5.8.29.jar -C cn.hutool.json module-info.class
  5. javac -p hutool-core-5.8.29.jar --patch-module cn.hutool.log=hutool-log-5.8.29.jar cn.hutool.log/module-info.java
  6. jar uf hutool-log-5.8.29.jar -C cn.hutool.log module-info.class
  7. javac -p "hutool-core-5.8.29.jar;hutool-log-5.8.29.jar" --patch-module cn.hutool.setting=hutool-setting-5.8.29.jar cn.hutool.setting/module-info.java
  8. jar uf hutool-setting-5.8.29.jar -C cn.hutool.setting module-info.class
复制代码

原项目依赖处理的 jars,jlink 打包

然后将处理好之后的 jars 复制到原项目 libs 目次,修改 maven 依赖,如果 idea 报红,则将 libs 添加到项目的 library
  1. <dependency>
  2.     <groupId>cn.hutool</groupId>
  3.     <artifactId>hutool-core</artifactId>
  4.     <version>5.8.29</version>
  5.     <scope>system</scope>
  6.     <systemPath>${project.basedir}/libs/hutool-core-5.8.29.jar</systemPath>
  7. </dependency>
  8. <dependency>
  9.     <groupId>cn.hutool</groupId>
  10.     <artifactId>hutool-setting</artifactId>
  11.     <version>5.8.29</version>
  12.     <scope>system</scope>
  13.     <systemPath>${project.basedir}/libs/hutool-setting-5.8.29.jar</systemPath>
  14. </dependency>
  15. <dependency>
  16.     <groupId>cn.hutool</groupId>
  17.     <artifactId>hutool-json</artifactId>
  18.     <version>5.8.29</version>
  19.     <scope>system</scope>
  20.     <systemPath>${project.basedir}/libs/hutool-json-5.8.29.jar</systemPath>
  21. </dependency>
  22. <dependency>
  23.     <groupId>cn.hutool</groupId>
  24.     <artifactId>hutool-log</artifactId>
  25.     <version>5.8.29</version>
  26.     <scope>system</scope>
  27.     <systemPath>${project.basedir}/libs/hutool-log-5.8.29.jar</systemPath>
  28. </dependency>
复制代码
然后执行 javafx:jlink,这时就能正常打包代码了
module-info 基础知识补充


  • module :声明模块及其名称。
  • open module :声明整个模块答应反射访问。
  • requires :声明对其他模块的依赖。
  • requires transitive :声明传递性依赖。
  • exports :公开包,使得其他模块可以访问。
  • opens :开放包,答应反射访问。
  • opens to :开放包,仅对指定模块答应反射访问。
  • uses :声明对服务接口的依赖。
  • provides ... with :声明服务接口的实现提供。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表