当前位置: 首页 > 知识库问答 >
问题:

JDEPS模块在列出依赖项时未发现异常

柯建业
2023-03-14

我一直在使用JLink为各种Spring Boot应用程序创建最小的JRE。我已经成功地通过尝试和错误找出所需的模块手动做到了这一点。在成功地完成这一任务之后,我一直试图使用JDEPS来自动化这个过程。

第一次尝试是为我的应用程序扫描构建的Jar。我正在使用Java14 jdeps来分析Java11代码库。

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
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运行相同的命令。由于未找到模块,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

共有1个答案

蒋俊
2023-03-14

我现在正在处理一个非常类似的问题。看起来在tomcat Embed9.0.37和9.0.38之间定义了显式模块信息。与自动模块相比,模块的名称发生了更改。

  • java.annotation模块是从annotations-api.jar导出的名称。我不知道它为什么用那个名字。我肯定是有原因的,我只是不明白。
  • org.apache.tomcat.embedd.jasper.el更改为org.apache.tomcat.embed.el

我不确定这能让你走多远,但这可能是一个开始。

 类似资料:
  • 问题内容: 我正在尝试使用以下命令运行jdeps: 我依赖于应用程序模块和自动模块。我将所有依赖项放在“模块”文件夹中,但出现错误: 但是,当我添加时,它工作正常。 难道我做错了什么?我以为jdeps会找到所有模块,而不是手动添加它们。 问题答案: 执行以下命令时: 从目录解析的模块是 可观察的模块 ,在您的情况下,它们无法进入 根模块集 。 在问题的另一部分- 另一方面,显式添加它们可确保模块存

  • 我试图将我的maven项目部署到Glassfish 4,但当它部署失败时,我遇到以下异常: http://maven.apache.org/xsd/maven-4.0.0.xsd“>4.0.0

  • 我有一个多模块maven项目。请在父POM下方找到。 儿童POM如下所示。 我已经在parent中声明了从slf4j进行日志记录,但在eclipse中没有生成相同的maven依赖项,因此我无法在代码中使用日志记录。谁能告诉我这里出了什么问题吗。

  • 当我运行main方法时,我得到了ClassNotFoundException。Spring依赖项是通过Maven添加的,这些依赖项在编译时得到解决。有很多类似的问题,但是当代码打包为jar并在eclipse之外执行时,每个人似乎都有问题。当我在eclipse本身中运行它时,我实际上遇到了这个问题。 这是pom文件 堆栈跟踪 java.lang.NoClassDefFoundError: org/s

  • 关于解决依赖关系,我与sbt有一些问题。 built.sbt Sbt版本:来自arch community repository的Sbt 1.0.0-2 运行操作系统:Antergos内核4.12.8-2-arch

  • 问题内容: 当前在app.js中,我有以下路线: 如您所见,我正在尝试注入Path依赖项。尽管我收到一条错误消息,说找不到该提供程序。我认为这是因为配置模块提供程序首先执行。以下是“ services.js”中我的路径提供程序定义 我怎样才能将此提供程序注入配置模块? 问题答案: 在中,只能使用提供程序(例如)。在你只能使用服务(如实例)。您有一家工厂,而不是供应商。请参阅具有以下三种创建方式的代