1

概括

11.0.10-在一些机器从 JDK 更新到JDK之后,我们的构建管道已经中断11.0.11+。这是由于jdeps行为改变而发生的。经过一些研究,它变得很明显,这可能是由于引入的变化JDK-8214213

假设我们正在检索 的依赖项sentry-1.7.25.jar,那么我们对jdepsvia 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 细节的深入探讨,所以如果我对这些场景的理解存在错误的术语或问题,请随时指出并纠正它们。

4

0 回答 0