Jetty 如何处理具有不同依赖项的相同类的类加载



我想知道当多个依赖路径可能导致同一类时,jetty如何处理。

例如

Jetty 预打包了 JSTL-1.2,但我添加了一个依赖项来加载 JSTL-1.2.4。在编译时,如果我断点测试它在 eclipse 中下载源代码,它会在 1.2.4 版本中断。

我想知道当有两个版本的类时,将传递哪个版本来生成 JSP 的字节码,比如依赖关系中的某个基类 JstlCoreTlv(一个预先打包,即带有 jetty 的 JSTL 1.2,一个从 maven 依赖项 1.2.4 传递)

简而言之,我想知道码头是如何做到的。我想知道 jetty 如何优先考虑预打包的依赖项与稍后添加的依赖项。即使版本比预打包的版本旧,它是否会覆盖并引用添加的依赖项?

在这种情况下,我无法从码头文档中获得太多信息。非常感谢帮助

  • 假设您不打算更改 Jetty 安装的 jstl 版本。
  • 假设你只使用 jstl 版本 1.2.4 来编译你的代码,并且你没有在你的战争 WEB-INF/lib 中添加 jar。

如果您针对 1.2.4 使用 maven 进行编译和打包,并在 Jetty 上部署打包的战争,Jetty 将使用 1.2(这是服务器类路径上的那个,而不是 1.2.4(因为它不适用于 Jetty)。这可能会导致问题。

避免出现问题的最佳方法是在 maven 项目依赖项中使用与将要部署的 Jetty 版本所使用的版本完全相同的版本。

servlet 规范要求:

    包含在 WEB-INF/
  • lib 或 WEB-INF/classes 中的类优先于父类加载器上的类(这里是 jetty 的类加载器)。

来自码头的文件

WEB INF 类可以替换服务器类。

这里的服务器类是 j2ee 标准的 jetty 实现(来自 jetty 源代码的代码):

    /** Is the class a Server Class.
     * A Server class is a class that is part of the implementation of 
     * the server and is NIT visible to a webapplication. The web
     * application may provide it's own implementation of the class,
     * to be loaded from WEB-INF/lib or WEB-INF/classes 
     * @param clazz The fully qualified name of the class.
     * @return True if the class is a server class.
     */
    boolean isServerClass(Class<?> clazz);

您还可以通过调用以下命令来添加对服务器类的控制:

  • org.eclipse.jetty.webapp.WebAppContext.setServerClasses(String Array)
  • org.eclipse.jetty.webapp.WebAppContext.addServerClass(String)

最新更新