java jlink 带有很多自动模块和/或未命名模块

问题描述 投票:0回答:1

我为正在开发的应用程序创建了一个模块(MyApp.jar) 该应用程序依赖于许多未命名或自动模块。

如何使用这些未命名或自动模块生成 jlink 图像?

我尝试为每个模块调用一个转换

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创建了镜像但是没有作用。 你有想法吗?

在模块化过程中我有很多警告(例如:警告:指定了 --ignore-missing-deps。忽略 org.apache.httpcomponents.httpclient 中缺少的依赖项)

这是所有依赖项的列表;

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
java module jlink jdeps
1个回答
0
投票

事实上,不可能创建包含非模块化 jar 的 jlink 映像。但是,您可以仅使用应用程序所需的 java 模块创建映像,然后使用类和/或模块路径。仅适用于类路径的示例工作流程(即使您的应用程序是模块化的也可以工作)。

给定一个包含所有应用程序 jar 的目录

jars
,首先使用
jdeps
:

找出需要哪些 java 模块
jdeps --multi-release 21 --module-path jars --print-module-deps --ignore-missing-deps jars/* | grep -v '^Warning: split package'

这将输出类似这样的内容:

java.base,java.x,java.y,...

现在创建 jlink 图像:

jlink --add-modules java.base,java.x,java.y,... --output jvm

运行应用程序:

jvm/bin/java --class-path 'jars/*' package.MainClass

如果你的主jar是模块化的,并且你想把它放在模块路径上,你必须把它和它的真实的、自动的模块依赖一起放在一个单独的目录中。您可以使用 jli 脚本 为您执行此操作:

jli -l jars -i -o -m main.module

这将创建一个目录

jli
,其中包含三个目录:

  • jvm
    :jlink 图像
  • cp
    :包含要放在类路径上的 jar 的目录
  • mp
    :包含要放在模块路径上的 jar 的目录

运行应用程序:

cd jli
jvm/bin/java --class-path 'cp/*' --module-path mp -m main.module/package.MainClass

注意,也可以将

jli
用于非模块化应用程序(帖子中的原始场景),这比执行
jdeps
jlink
命令要容易一些,并且它添加了一些额外的选项默认使用
jlink
命令,优化图像大小:

jli -l jars -i
jli/jvm/bin/java --class-path 'jars/*' package.MainClass
© www.soinside.com 2019 - 2024. All rights reserved.