dzi*_*zim 10 java javafx java-platform-module-system jdeps java-17
我们有一个基于 JavaFX 的应用程序,它没有模块化(有原因,涉及遗留库),但我们使用jdeps和构建了一个自定义运行时jlink。
我们最近重写了该应用程序并添加了一些新的依赖项,并删除了其他依赖项。现在,正在构建应用程序的脚本在jdeps通话期间突然停止工作。
注意:这种情况发生在 Linux \xe2\x80\x93 上,我尚未测试其他操作系统,但我不期望出现另一个结果。
\n当脚本调用时
\n~/path/to/jdk/bin/jdeps -q --multi-release 11 --ignore-missing-deps --print-module-deps --class-path ~/path/to/app/target/package/libs/* target/classes/ch/cnlab/uxtest/MainKt.class\nRun Code Online (Sandbox Code Playgroud)\n结果总是
\nException in thread "main" java.lang.Error: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:271)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.parse(DependencyFinder.java:133)\n at jdk.jdeps/com.sun.tools.jdeps.DepsAnalyzer.transitiveArchiveDeps(DepsAnalyzer.java:217)\n at jdk.jdeps/com.sun.tools.jdeps.DepsAnalyzer.run(DepsAnalyzer.java:138)\n at jdk.jdeps/com.sun.tools.jdeps.ModuleExportsAnalyzer.run(ModuleExportsAnalyzer.java:74)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask$ListModuleDeps.run(JdepsTask.java:1047)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:574)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)\n at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)\nCaused by: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException\n at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)\n at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:267)\n ... 8 more\nCaused by: com.sun.tools.jdeps.MultiReleaseException\n at jdk.jdeps/com.sun.tools.jdeps.VersionHelper.add(VersionHelper.java:62)\n at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileReader.readClassFile(ClassFileReader.java:360)\n at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileIterator.hasNext(ClassFileReader.java:402)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.lambda$parse$5(DependencyFinder.java:179)\n at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n at java.base/java.lang.Thread.run(Thread.java:833)\nRun Code Online (Sandbox Code Playgroud)\n我找不到太多关于这个特定异常的信息,而且到目前为止我发现的所有内容都不适用于我们的情况。
\n为了不等待构建达到这一点,我让程序在执行之前打印出命令并在终端上使用它。然后事情就变得有点奇怪了:
\nException in thread "main" java.lang.module.FindException: Module org.slf4j not found, required by com.dlsc.gmapsfx\n at java.base/java.lang.module.Resolver.findFail(Resolver.java:893)\n at java.base/java.lang.module.Resolver.resolve(Resolver.java:192)\n at java.base/java.lang.module.Resolver.resolve(Resolver.java:141)\n at java.base/java.lang.module.Configuration.resolve(Configuration.java:421)\n at java.base/java.lang.module.Configuration.resolve(Configuration.java:255)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:603)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:557)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)\n at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)\nRun Code Online (Sandbox Code Playgroud)\n为什么我突然得到一个不同的异常?现在哪一个是正确的?我没有任何线索。
\n事实是,包含的 jarorg.slf4j仅具有自动模块名称。
我真的不知道,我应该用很少的信息做什么......如果其他人可以指出一些东西,我会很高兴。
\n谢谢,\n丹尼尔
\nPS:以下代码打印命令并执行:
\n~/path/to/jdk/bin/jdeps -q --multi-release 11 --ignore-missing-deps --print-module-deps --class-path ~/path/to/app/target/package/libs/* target/classes/ch/cnlab/uxtest/MainKt.class\nRun Code Online (Sandbox Code Playgroud)\n他们似乎确实创造了不同的结果......
\nPPS:如果我删除该--multi-release部分,我会收到不同的错误,即jackson多重版本,但我需要指定我想要的内容......
Error: jackson-core-2.13.0.jar is a multi-release jar file but --multi-release option is not set\nRun Code Online (Sandbox Code Playgroud)\n编辑#1
\n在 pom 文件中,我们有以下 deps
\nException in thread "main" java.lang.Error: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:271)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.parse(DependencyFinder.java:133)\n at jdk.jdeps/com.sun.tools.jdeps.DepsAnalyzer.transitiveArchiveDeps(DepsAnalyzer.java:217)\n at jdk.jdeps/com.sun.tools.jdeps.DepsAnalyzer.run(DepsAnalyzer.java:138)\n at jdk.jdeps/com.sun.tools.jdeps.ModuleExportsAnalyzer.run(ModuleExportsAnalyzer.java:74)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask$ListModuleDeps.run(JdepsTask.java:1047)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:574)\n at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)\n at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)\nCaused by: java.util.concurrent.ExecutionException: com.sun.tools.jdeps.MultiReleaseException\n at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)\n at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.waitForTasksCompleted(DependencyFinder.java:267)\n ... 8 more\nCaused by: com.sun.tools.jdeps.MultiReleaseException\n at jdk.jdeps/com.sun.tools.jdeps.VersionHelper.add(VersionHelper.java:62)\n at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileReader.readClassFile(ClassFileReader.java:360)\n at jdk.jdeps/com.sun.tools.jdeps.ClassFileReader$JarFileIterator.hasNext(ClassFileReader.java:402)\n at jdk.jdeps/com.sun.tools.jdeps.DependencyFinder.lambda$parse$5(DependencyFinder.java:179)\n at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n at java.base/java.lang.Thread.run(Thread.java:833)\nRun Code Online (Sandbox Code Playgroud)\n生成以下 JAR 文件(减去我们自己的):
\nannotations-13.0.jar\napiguardian-api-1.1.2.jar\nconscrypt-openjdk-2.5.2-linux-x86_64.jar\ncontrolsfx-11.1.0.jar\nGMapsFX-11.0.2.jar\nhamcrest-core-1.3.jar\nikonli-core-12.2.0.jar\nikonli-javafx-12.2.0.jar\nikonli-materialdesign2-pack-12.2.0.jar\njackson-annotations-2.13.0.jar\njackson-core-2.13.0.jar\njackson-databind-2.13.0.jar\njackson-module-kotlin-2.13.0.jar\njakarta.activation-1.2.2.jar\njakarta.activation-api-1.2.2.jar\njakarta.xml.bind-api-2.3.3.jar\njaxb-impl-2.3.3.jar\njunit-4.12.jar\njunit-jupiter-api-5.8.1.jar\njunit-jupiter-engine-5.8.1.jar\njunit-platform-commons-1.8.1.jar\njunit-platform-engine-1.8.1.jar\nkoin-core-jvm-3.1.3.jar\nkoin-test-jvm-3.1.3.jar\nkotlin-reflect-1.5.31.jar\nkotlin-stdlib-1.5.31.jar\nkotlin-stdlib-common-1.5.30.jar\nkotlin-stdlib-jdk7-1.5.31.jar\nkotlin-stdlib-jdk8-1.5.31.jar\nkotlin-test-1.5.31.jar\nkotlin-test-annotations-common-1.5.30.jar\nkotlin-test-common-1.5.30.jar\nkotlin-test-junit-1.5.31.jar\nkotlinx-coroutines-core-1.5.2.jar\nkotlinx-coroutines-core-jvm-1.5.2.jar\nkotlinx-coroutines-jdk8-1.5.2.jar\nlog4j-api-2.14.1.jar\nlog4j-core-2.14.1.jar\nlog4j-web-2.14.1.jar\nlogback-classic-1.2.3.jar\nlogback-core-1.2.3.jar\nokhttp-4.9.2.jar\nokio-2.8.0.jar\nopentest4j-1.2.0.jar\nproguard-base-6.2.2.jar\nsimple-xml-2.7.1.jar\nslf4j-api-1.7.29.jar\nsqlite-jdbc-3.36.0.3.jar\nstax-1.2.0.jar\nstax-api-1.0.1.jar\nxpp3-1.1.3.3.jar\nRun Code Online (Sandbox Code Playgroud)\n使用的 Java 版本是Bell Soft 的 Full Liberica JDK 17 ,我们使用了 14 或 15 以来的所有最新版本,在重建 UI 之前它运行良好。
\n编辑#2:
\n的结果
\nmvn compile org.apache.maven.plugins:maven-dependency-plugin:3.1.1:resolve -DexcludeTransitive\nRun Code Online (Sandbox Code Playgroud)\n是
\n[INFO] The following files have been resolved:\n[INFO] com.fasterxml.jackson.core:jackson-databind:jar:2.13.0:compile -- module com.fasterxml.jackson.databind\n[INFO] com.squareup.okhttp3:okhttp:jar:4.9.2:compile -- module okhttp3 [auto]\n[INFO] com.fasterxml.jackson.core:jackson-annotations:jar:2.13.0:compile -- module com.fasterxml.jackson.annotation\n[INFO] org.openjfx:javafx-fxml:jar:17.0.1:compile -- module javafx.fxmlEmpty [auto]\n[INFO] org.openjfx:javafx-web:jar:17.0.1:compile -- module javafx.webEmpty [auto]\n[INFO] org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:1.5.31:compile -- module kotlin.stdlib.jdk8\n[INFO] io.insert-koin:koin-core-jvm:jar:3.1.3:compile -- module koin.core.jvm (auto)\n[INFO] org.jetbrains.kotlin:kotlin-test-junit:jar:1.5.31:test -- module kotlin.test.junit\n[INFO] org.simpleframework:simple-xml:jar:2.7.1:compile -- module simple.xml [auto]\n[INFO] org.apache.logging.log4j:log4j-core:jar:2.14.1:compile -- module org.apache.logging.log4j.core [auto]\n[INFO] io.insert-koin:koin-test-jvm:jar:3.1.3:compile -- module koin.test.jvm (auto)\n[INFO] org.junit.jupiter:junit-jupiter-engine:jar:5.8.1:test -- module org.junit.jupiter.engine\n[INFO] org.xerial:sqlite-jdbc:jar:3.36.0.3:compile -- module org.xerial.sqlitejdbc [auto]\n[INFO] net.sf.proguard:proguard-base:jar:6.2.2:runtime -- module proguard.base (auto)\n[INFO] org.openjfx:javafx-graphics:jar:17.0.1:compile -- module javafx.graphicsEmpty [auto]\n[INFO] org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:1.5.2:compile -- module kotlinx.coroutines.core (auto)\n[INFO] org.apache.logging.log4j:log4j-web:jar:2.14.1:compile -- module org.apache.logging.log4j.web [auto]\n[INFO] ch.<ourgroup>:<our-artifact>:1.8.8:compile -- module <our-lib> (auto)\n[INFO] org.openjfx:javafx-controls:jar:17.0.1:compile -- module javafx.controlsEmpty [auto]\n[INFO] org.controlsfx:controlsfx:jar:11.1.0:compile -- module org.controlsfx.controls\n[INFO] com.fasterxml.jackson.core:jackson-core:jar:2.13.0:compile -- module com.fasterxml.jackson.core\n[INFO] com.fasterxml.jackson.module:jackson-module-kotlin:jar:2.13.0:compile -- module com.fasterxml.jackson.kotlin\n[INFO] org.apache.logging.log4j:log4j-api:jar:2.14.1:compile -- module org.apache.logging.log4j\n[INFO] org.openjfx:javafx-base:jar:17.0.1:compile -- module javafx.baseEmpty [auto]\n[INFO] org.junit.jupiter:junit-jupiter-api:jar:5.8.1:test -- module org.junit.jupiter.api\n[INFO] org.kordamp.ikonli:ikonli-javafx:jar:12.2.0:compile -- module org.kordamp.ikonli.javafx\n[INFO] com.dlsc:GMapsFX:jar:11.0.2:compile -- module com.dlsc.gmapsfx\n[INFO] org.jetbrains.kotlin:kotlin-reflect:jar:1.5.31:compile -- module kotlin.reflect\n[INFO] org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:jar:1.5.2:compile -- module kotlinx.coroutines.jdk8 (auto)\n[INFO] org.kordamp.ikonli:ikonli-materialdesign2-pack:jar:12.2.0:compile -- module org.kordamp.ikonli.materialdesign2\n[INFO] org.conscrypt:conscrypt-openjdk:jar:linux-x86_64:2.5.2:compile -- module org.conscrypt [auto]\nRun Code Online (Sandbox Code Playgroud)\n
Jor*_*nee 10
更新:这些问题已得到修复,并且修补版本jdeps可作为 JDK 18 早期访问版本的一部分提供,网址为:http://jdk.java.net/18/(从版本 26 开始)
将我的评论转化为答案。这里似乎存在 3 个错误:
MultiReleaseException是因为jdeps无法处理具有相同名称的不同 jar 中的类,例如module-info.class,但存储在不同的META-INF/versions/xxx目录中。(JDK-8277165)MultiReleaseException异常消息,因为它是作为异步任务的一部分抛出的,异步任务将其包装在 中ExecutionException,从而导致jdeps无法正确报告异常。(JDK-8277123)至于解决方法,我认为目前没有一个好的解决方法,除了编辑类路径上的所有 jar 以便将它们放在module-info.class同一META-INF/versions/xxx目录中(但是,这也可能会产生其他后果,所以您可能不想使用编辑后的 jar 运行,并且仅将它们用于jdeps)。