概括
11.0.10-
在一些机器从 JDK 更新到JDK之后,我们的构建管道已经中断11.0.11+
。这是由于jdeps
行为改变而发生的。经过一些研究,它变得很明显,这可能是由于引入的变化JDK-8214213
:
假设我们正在检索 的依赖项sentry-1.7.25.jar
,那么我们对jdeps
via CLI 的使用如下:
jdeps --list-deps -filter:module --multi-release=11 "..\somePath\sentry-1.7.25.jar
生成的依赖列表如下所示:
11.0.10
及以下
java.base
java.logging
java.naming
11.0.11
以上
Error: Missing dependencies: classes not found from the module path and classpath.
To suppress this error, use --ignore-missing-deps to continue.
sentry-1.7.25.jar
io.sentry.event.helper.BasicRemoteAddressResolver -> javax.servlet.http.HttpServletRequest not found
io.sentry.event.helper.ForwardedAddressResolver -> javax.servlet.http.HttpServletRequest not found
io.sentry.event.helper.HttpEventBuilderHelper -> javax.servlet.http.HttpServletRequest not found
io.sentry.event.helper.RemoteAddressResolver -> javax.servlet.http.HttpServletRequest not found
io.sentry.event.interfaces.HttpInterface -> javax.servlet.http.Cookie not found
io.sentry.event.interfaces.HttpInterface -> javax.servlet.http.HttpServletRequest not found
io.sentry.servlet.SentryServletContainerInitializer -> javax.servlet.ServletContainerInitializer not found
io.sentry.servlet.SentryServletContainerInitializer -> javax.servlet.ServletContext not found
io.sentry.servlet.SentryServletContainerInitializer -> javax.servlet.ServletException not found
io.sentry.servlet.SentryServletRequestListener -> javax.servlet.ServletRequest not found
io.sentry.servlet.SentryServletRequestListener -> javax.servlet.ServletRequestEvent not found
io.sentry.servlet.SentryServletRequestListener -> javax.servlet.ServletRequestListener not found
io.sentry.servlet.SentryServletRequestListener -> javax.servlet.http.HttpServletRequest not found
为了在 OpenJDK 上解决这个问题11.0.11+
,需要--ignore-missing-deps
在调用jdeps
. 如果完成,则输出再次看起来正确:
java.base
java.logging
java.naming
问题
因此,我可以使用 JDK 产生与使用 JDK 相同的jdeps
输出。话虽如此,此输出用于创建自定义运行时,并且在描述中明确说明:11.0.11+
11.0.10-
JDK-8214213
请注意,在将
--ignore-missing-deps
选项用于非模块化应用程序时,将使用 jdeps 输出的模块列表创建自定义图像。在自定义映像上运行的此类应用程序可能会在抑制缺失依赖错误时在运行时失败。
根据我的理解,这意味着如果涉及传递依赖项,其中依赖项的依赖项需要任何顶级依赖项都不需要的运行时模块,那么这可能导致自定义运行时无法运行应用程序,因为传递依赖无法解决。换句话说,如果我的应用程序需要依赖项A
,这需要依赖项B
和模块C
,但依赖项B
也需要模块D
,那么我的应用程序就有遇到运行时错误的风险,因为我的自定义运行时没有提供模块D
。
我现在的问题是这个,因为我无法从文档中得出它:
如果使用 JDK 11.0.11+
,我只能获得相同的依赖项列表输出--ignore-missing-deps
。是不是意味着...
- ...
jdeps
能够在 之前解决传递依赖11.0.11
,但不能在上述版本之上再这样做,例如因为依赖分析在内部以不同的方式完成jdeps
? - ...
jdeps
就好像它在默认情况下使用--ignore-missing-deps
之前一样11.0.11
,因此如果默认更改,jdeps
现在会在11.0.11+
? - ……还有什么事吗?
生成的依赖列表可能是相同的,只是因为有很多库,所以大多数模块都以任何一种方式使用。但是我试图确定,是否
jdeps --list-deps -filter:module --multi-release=11 "..\somePath\sentry-1.7.25.jar (11.0.10)
和
jdeps --list-deps --ignore-missing-deps -filter:module --multi-release=11 "..\somePath\sentry-1.7.25.jar (11.0.11)
行为完全相同,或者--ignore-missing-deps
在将新库添加到我们的项目时是否会引入新风险,因为它们可能在某些时候需要一个不属于当前jdeps
-list 的模块。
请记住,对我来说,这是对 OpenJDK 细节的深入探讨,所以如果我对这些场景的理解存在错误的术语或问题,请随时指出并纠正它们。