列出依赖项时找不到JDEPS模块异常

问题描述

我一直在与JLink一起为各种Spring Boot应用程序创建最小的JRE。通过反复试验找出所需的模块,我已经成功地手动完成了此任务。成功完成此操作后,我一直在尝试使用JDeps自动执行此过程。

第一次尝试是为我的应用程序扫描生成的Jar。我正在使用Java 14 jdeps来分析Java 11代码库。

jdeps --class-path BOOT-INF/classes --module-path BOOT-INF/lib/,${JAVA_HOME}/jmods --add-modules=ALL-module-path --list-deps target/camel-account-sapi-0.0.2-SNAPSHOT.jar

这导致几个未找到的依赖项。

Error: Missing dependencies: classes not found from the module path and classpath.
To suppress this error,use --ignore-missing-deps to continue.

camel-account-sapi-0.0.2-SNAPSHOT.jar
   com.ms3.camelaccountsapi.CamelAccountSapiApplication -> org.springframework.boot.SpringApplication         not found
   com.ms3.camelaccountsapi.CamelAccountSapiApplication -> org.springframework.boot.autoconfigure.SpringBootApplication not found
   com.ms3.camelaccountsapi.CamelAccountSapiApplication -> org.springframework.context.ConfigurableApplicationContext not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.apache.camel.builder.RouteBuilder              not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.apache.camel.model.rest.RestDeFinition         not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.apache.camel.model.rest.RestOperationParamDeFinition not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.apache.camel.model.rest.RestParamType          not found
   com.ms3.camelaccountsapi.routes.GeneratedRoutesInterface -> org.springframework.stereotype.Component           not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> com.datasonnet.document.MediaTypes                 not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.Exchange                          not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.Expression                        not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.LoggingLevel                      not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.Predicate                         not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.builder.DatasonnetBuilder         not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.builder.RouteBuilder              not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.builder.SimpleBuilder             not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.builder.ValueBuilder              not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.model.ChoiceDeFinition            not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.model.OnExceptionDeFinition       not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.model.ProcessorDeFinition         not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.apache.camel.model.RouteDeFinition             not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.slf4j.Logger                                   not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.slf4j.LoggerFactory                            not found
   com.ms3.camelaccountsapi.routes.RoutesImplementation -> org.springframework.stereotype.Component           not found
   org.springframework.boot.loader.PropertiesLauncher -> org.springframework.util.Assert                    not found
   org.springframework.boot.loader.jarmode.JarModeLauncher -> org.springframework.core.io.support.SpringFactoriesLoader not found
   org.springframework.boot.loader.jarmode.JarModeLauncher -> org.springframework.util.ClassUtils                not found

添加--ignore-missing-deps会产生更完整但不完整的含义:

java.base
java.logging

接下来,我使用java -Djarmode=layertools -jar ./target/camel-account-sapi-0.0.2-SNAPSHOT.jar extract

提取了应用程序

这给了我BOOT-INF / lib文件夹,其中包含所有150个JAR相关性。因此,我尝试运行与以前类似的JDeps命令,并带有一些其他选项: jdeps --module-path temp/BOOT-INF/lib/,${JAVA_HOME}/jmods --add-modules=ALL-module-path --multi-release 11 --list-deps --ignore-missing-deps --recursive --compile-time temp/BOOT-INF/lib/*

但这会导致异常

Exception in thread "main" java.lang.module.FindException: Module java.annotation not found,required by org.apache.tomcat.embed.core
    at java.base/java.lang.module.Resolver.findFail(Resolver.java:894)
    at java.base/java.lang.module.Resolver.resolve(Resolver.java:191)
    at java.base/java.lang.module.Resolver.resolve(Resolver.java:140)
    at java.base/java.lang.module.Configuration.resolve(Configuration.java:422)
    at java.base/java.lang.module.Configuration.resolve(Configuration.java:256)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:603)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:557)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)
    at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)

我注意到/ lib文件夹中的某些JAR可以成功进行分析,因此我编写了一个Bash脚本以在每个/ lib jar上运行相同的命令,而忽略异常。由于Module not found,无法分析150个模块中的15个,但是其他135个模块的结果列表非常接近。它仅缺少一个必需的模块jdk.crypto.ec并找到了所有其他模块:

java.sql,java.security.jgss,java.logging,java.xml,java.compiler,jdk.unsupported,java.transaction.xa,java.rmi,java.management,java.instrument,java.naming,java.base,java.datatransfer,jdk.httpserver,java.scripting,java.desktop,java.prefs

我走错了方向吗?还是可以/应该做些什么来解决这些缺少的模块问题?我认为,例如,java.annotation上方的“缺少”模块可能存在于其他JAR之一中吗?我相信,由于其他15条jdeps命令失败,这种情况更加严重。

temp/BOOT-INF/lib/tomcat-embed-core-9.0.38.jar
Exception in thread "main" java.lang.module.FindException: Module java.annotation not found,required by org.apache.tomcat.embed.core
    at java.base/java.lang.module.Resolver.findFail(Resolver.java:894)
    at java.base/java.lang.module.Resolver.resolve(Resolver.java:191)
    at java.base/java.lang.module.Resolver.resolve(Resolver.java:140)
    at java.base/java.lang.module.Configuration.resolve(Configuration.java:422)
    at java.base/java.lang.module.Configuration.resolve(Configuration.java:256)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:603)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:557)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)
    at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)
error
temp/BOOT-INF/lib/tomcat-embed-websocket-9.0.38.jar
Exception in thread "main" java.lang.module.FindException: Module org.apache.tomcat.embed.core not found,required by org.apache.tomcat.embed.websocket
    at java.base/java.lang.module.Resolver.findFail(Resolver.java:894)
    at java.base/java.lang.module.Resolver.resolve(Resolver.java:191)
    at java.base/java.lang.module.Resolver.resolve(Resolver.java:140)
    at java.base/java.lang.module.Configuration.resolve(Configuration.java:422)
    at java.base/java.lang.module.Configuration.resolve(Configuration.java:256)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:603)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:557)
    at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)
    at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)
error

解决方法

我正在解决一个非常相似的问题。看起来像在Tomcat嵌入的9.0.37和9.0.38之间定义了显式的模块信息。与自动模块相比,模块的名称已更改。

  • java.annotation模块是从注解api.jar导出的名称。我不知道为什么要使用这个名字。我确定是有原因的,我只是不理解。
  • org.apache.tomcat.embed.jasper.el更改为org.apache.tomcat.embed.el

我不确定这能带给你多远,但这也许是一个开始。