我想知道当多个依赖路径可能导致同一类时,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)