我目前正在使用 hibernate-4.1.4 和 jersey-2.22。它们分别有 javassist-3.15 和 javassist-3.18。
我在我的项目中包含了 hibernate 和 jersey,令我惊讶的是,上述 javassists 之间没有依赖冲突。
我想知道 Java 如何告诉 hibernate 使用 3.15 以及如何告诉 jersey 使用 3.18,因为两者都在构建路径中。是否没有使用一名 Javassist?
后续问题:假设javassist-3.15和javassist-3.18相互冲突。我该如何解决这个问题?我是否要禁用两个 javassists 并在外部添加一个 javassists?
编辑:我的应用程序是一个在 Tomcat 7 上运行的 Web 应用程序。我们不使用 Maven/Gradle。我们只需使用 Eclipse 将 jar 放入构建路径来配置依赖项。
最佳答案
JAVA 通过 ClassLoaders 加载类...许多应用程序服务器,如 Tomcat 或 Wildfly,实现并使用自己的类加载器(不是常见 JDK 的常规类加载器)...因此您必须查看 Tomcat 文档来阅读有关内容它的类加载行为...
话虽如此,Tomcat 很可能是按字母顺序加载库的。我解释一下...
假设您使用名为:Dummy
的类,此类包含在库中: dummy-1.0.jar
和dummy-1.1.jar
...上课时Dummy
收到请求后,Tomcat 类加载器会搜索该类定义,首先查看 dummy-1.0.jar
稍后在 dummy-1.1.jar
...鉴于 dummy-1.0.jar
包含该类,Tomcat 停止查找并返回该类版本...如果 dummy-1.0.jar
不会有目标类, dummy-1.1.jar
类版本将被返回...
(我建议尝试这个来验证容器行为,它并不难实现)...
是的,如果 javassist-3.15
和javassist-3.18
彼此冲突,您应该删除它们并选择 javassist JAR 更多
适用于两个库(jersey 和 hibernate)。
根据经验,我倾向于选择最新的库(版本更高的库),但这种方案并不总是有效......
关于java - Hibernate 和 Jersey 依赖冲突(javassist) - 谁能解释这是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286203/