问题描述
我一直在与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
我不确定这能带给你多远,但这也许是一个开始。