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

依赖大量未命名/自动模块时,如何生成可用的jlink镜像?

问题描述

我开发的应用模块MyApp.jar依赖大量未命名模块或自动模块,想要生成包含这些模块的jlink镜像,于是用modularize.bat脚本逐个转换依赖模块,示例命令:

modularize.bat commons-io-2.10.0.jar org.apache.commons.io

modularize.bat脚本内容:

set _jar_=%1
set _name_=%2
jdeps --ignore-missing-deps --generate-module-info target\libs target\libs\%_jar_%
type target\libs\%_name_%\module-info.java
javac --patch-module %_name_%=target\libs\%_jar_% target\libs\%_name_%\module-info.java
jar uf target\libs\%_jar_% -C target\libs\%_name_% module-info.class
rmdir /S /Q target\libs\%_name_%

最终jlink成功生成镜像但无法正常运行,且模块化过程中出现大量缺失依赖警告(例:Warning: --ignore-missing-deps specified. Missing dependencies from org.apache.httpcomponents.httpclient are ignored)。

所有依赖列表:

checker-qual-3.12.0.jar
commons-codec-1.11.jar
commons-io-2.10.0.jar
commons-logging-1.2.jar
error_prone_annotations-2.7.1.jar
failureaccess-1.0.1.jar
flatlaf-3.4.jar
flatlaf-intellij-themes-3.4.jar
google-api-client-1.33.0.jar
google-api-services-drive-v3-rev197-1.25.0.jar
google-api-services-oauth2-v2-rev157-1.25.0.jar
google-http-client-1.41.0.jar
google-http-client-apache-v2-1.41.0.jar
google-http-client-gson-1.41.0.jar
google-http-client-jackson2-1.33.0.jar
google-oauth-client-1.32.1.jar
google-oauth-client-java6-1.33.0.jar
google-oauth-client-jetty-1.33.0.jar
grpc-context-1.27.2.jar
gson-2.8.9.jar
guava-31.0.1-jre.jar
hamcrest-core-1.3.jar
httpclient-4.5.13.jar
httpcore-4.4.15.jar
j2objc-annotations-1.3.jar
jackson-core-2.10.0.jar
jsch-0.2.11.jar
jsr305-3.0.2.jar
junit-4.13.2.jar
listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
log4j-api-2.23.1.jar
log4j-core-2.23.1.jar
opencensus-api-0.28.0.jar
opencensus-contrib-http-util-0.28.0.jar
解决方案

1. 移除--ignore-missing-deps,修复依赖链

脚本中jdeps的--ignore-missing-deps参数会跳过依赖检查,导致生成的module-info.java缺失必要的requires声明,这是镜像运行失败的核心原因。

修改jdeps命令,去掉该参数:

jdeps --generate-module-info target\libs target\libs\%_jar_%

此时jdeps会完整分析依赖,生成包含正确requires的模块描述。如果遇到缺失依赖报错,确保所有依赖jar都在target\libs目录下,按依赖顺序处理模块(比如先处理commons-codec再处理httpclient,因为httpclient依赖commons-codec)。

2. 区分自动模块与需转换模块

  • 部分依赖本身是自动模块(jar中包含Automatic-Module-Name属性),不需要手动生成module-info,直接作为模块加入jlink即可,避免重复处理导致冲突。
  • 空jar如listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,直接作为自动模块使用,无需转换。
  • 测试依赖(junit、hamcrest-core)如果不需要打包进镜像,直接排除,减少转换工作量。

3. 验证生成的module-info.java

jdeps自动生成的模块描述可能存在问题,在执行javac前检查:

  • 确认所有必要依赖都有requires声明
  • 若其他模块需要访问当前模块的包,手动添加exports语句(如果jdeps未自动生成)

4. 按拓扑排序批量处理依赖

手动逐个处理效率低且易出错,建议:

  1. 用jdeps --list-deps分析所有依赖的拓扑顺序
  2. 编写脚本按顺序批量处理模块,确保先处理被依赖的模块,再处理依赖它的模块

5. 用jlink预检查模块完整性

生成镜像前,用--dry-run参数验证模块是否能正确解析:

jlink --module-path target\libs;%JAVA_HOME%\jmods --add-modules MyApp,org.apache.commons.io,... --dry-run

如果存在模块缺失或依赖错误,会提前报错,方便排查。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:50:54