You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决jlink提示“自动模块名称无法与jlink一起使用”的问题?

解决JavaFX应用jlink打包时自动模块报错及全量打包方案

问题根源

jlink仅支持带module-info.class的显式模块化JAR,而BouncyCastle和ZXing的依赖属于自动模块(无module-info.class),因此打包时触发报错。

处理无module-info的依赖

提供两种可行方案,新手推荐第二种:

方案1:手动为依赖添加module-info

适合严格遵循模块化规范的场景:

  • 用jdeps分析依赖的模块关系,生成基础module-info.java:
    # 处理BouncyCastle的bcprov-jdk15on.jar
    jdeps --generate-module-info . bcprov-jdk15on-1.60.jar
    # 处理ZXing的core.jar
    jdeps --generate-module-info . core-3.5.0.jar
    
  • 检查生成的module-info.java,调整exports(对外暴露的包)和requires(依赖的其他模块)语句,匹配实际使用需求。
  • 编译module-info.java并补丁到原JAR:
    # 编译BouncyCastle的module-info
    javac --patch-module org.bouncycastle.provider=bcprov-jdk15on-1.60.jar org/bouncycastle/provider/module-info.java
    # 将编译后的class加入原JAR
    jar uf bcprov-jdk15on-1.60.jar -C org/bouncycastle/provider module-info.class
    
  • ZXing的JAR重复上述步骤,完成后所有依赖变为显式模块,即可正常使用jlink。

方案2:将依赖合并到自身模块(新手友好)

通过Maven的maven-shade-plugin把所有依赖打包到应用JAR中,消除自动模块问题:

  • 在项目pom.xml中添加插件配置:
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.4.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <!-- 替换为你的主类全路径 -->
                <mainClass>com.github.rkdharun.flexi.Main</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
    
  • 执行mvn package,target目录会生成包含所有依赖的shaded JAR(文件名格式通常为项目名-版本号-shaded.jar)。
  • 确保自身项目的module-info.java声明了对合并后代码的访问权限,示例:
    module com.github.rkdharun.flexi {
      requires javafx.controls;
      requires javafx.fxml;
      opens com.github.rkdharun.flexi to javafx.fxml;
      exports com.github.rkdharun.flexi;
    }
    

打包应用+依赖+JRE的完整流程

依赖合并完成后,结合jlink和jpackage生成包含JRE的可执行包:

  1. 生成自定义JRE(仅包含应用所需模块):

    jlink --module-path "你的JavaFX模块JAR目录;target/classes" \
          --add-modules com.github.rkdharun.flexi \
          --output custom-jre
    

    (替换你的JavaFX模块JAR目录为本地Maven仓库中JavaFX模块的路径,例如C:\Users\dharu\.m2\repository\org\openjfx\下对应版本的win模块目录)

  2. 生成桌面应用安装包/可执行文件:

    jpackage --name Flexi \
             --module com.github.rkdharun.flexi/com.github.rkdharun.flexi.Main \
             --runtime-image custom-jre \
             --input target \
             --main-jar flexi-1.0-SNAPSHOT-shaded.jar
    
    • --name:设置应用显示名称
    • --module:指定主模块和主类全路径
    • --runtime-image:指定第一步生成的自定义JRE
    • --input:指定包含shaded JAR的目录
    • --main-jar:指定shade插件生成的JAR文件名

若想简化流程,可使用jpackage-maven-plugin,将上述步骤配置到pom.xml中,直接通过Maven命令完成打包。

内容的提问来源于stack exchange,提问作者Dharun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:22:46