我一直在使用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
我现在正在处理一个非常类似的问题。看起来在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”中我的路径提供程序定义 我怎样才能将此提供程序注入配置模块? 问题答案: 在中,只能使用提供程序(例如)。在你只能使用服务(如实例)。您有一家工厂,而不是供应商。请参阅具有以下三种创建方式的代