Jetty如何使用具有不同依赖关系的相同类处理类加载?

时间:2017-01-05 19:19:58

标签: java dependency-injection jetty jstl jetty-8

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

例如,

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

我想知道哪个版本将被传递以生成JSP的字节代码,当有两个版本的类时,比如某个基类 JstlCoreTlv 依赖(一个预打包,即带有码头的JSTL 1.2和来自maven依赖的1.2.4)

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

在这种情况下,我从jetty文档中得不到多少。非常感谢帮助

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:4)

servlet规范要求:

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

来自document of jetty

  

WEB-INF类可以替换Server类。

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

    /** 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);

您还可以通过调用:

添加对服务器类的控制