Hibernate和Jersey依赖冲突(javassist)——有人能解释这是如何工作的吗?

Hibernate和Jersey依赖冲突(javassist)——有人能解释这是如何工作的吗?,java,hibernate,jersey,dependency-management,Java,Hibernate,Jersey,Dependency Management,我目前正在使用hibernate-4.1.4和jersey-2.22。它们分别有javassist-3.15和javassist-3.18 我在项目中包括了hibernate和jersey,令我惊讶的是,上述Javassist之间没有依赖冲突 我想知道Java是如何告诉hibernate使用3.15的,又是如何告诉jersey使用3.18的,因为两者都在构建路径中。是否没有使用一个javassist 后续问题:假设javassist-3.15和javassist-3.18相互冲突。我如何解决这个

我目前正在使用hibernate-4.1.4和jersey-2.22。它们分别有javassist-3.15和javassist-3.18

我在项目中包括了hibernate和jersey,令我惊讶的是,上述Javassist之间没有依赖冲突

我想知道Java是如何告诉hibernate使用3.15的,又是如何告诉jersey使用3.18的,因为两者都在构建路径中。是否没有使用一个javassist

后续问题:假设javassist-3.15和javassist-3.18相互冲突。我如何解决这个问题?我是否同时禁用两个Javassis并在外部包含一个


编辑:我的应用程序是一个在Tomcat 7上运行的web应用程序。我们不使用Maven/Gradle。我们只是通过使用Eclipse将JAR放入构建路径来配置依赖项。

JAVA通过类加载器加载类。。。许多应用服务器,如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)


根据经验,我倾向于选择最新的库(版本更高的库),但这个方案并不总是有效…

您使用什么将这些库导入到您的项目中??Maven?不,我没有用Maven。我们只是将JAR包含到Eclipse构建路径中。右键单击项目->属性->构建路径->添加外部jar。我知道这很奇怪,但这就是为什么你的应用程序是一个独立的JAVA应用程序??o它是一个在特殊容器(Tomcat、JBoss等)中运行的企业应用程序(WEB、EJB等)…很抱歉没有说得更具体。它是一个在Tomcat 7上运行的web应用程序,是的,如果javassist-3.15和javassist-3.18相互冲突,您应该删除它们并选择更适合这两个库(jersey和hibernate)的javassist JAR。那么,我如何知道javassist的特定版本是否同时适用于Hibernate和Jersey呢?我在哪里可以找到这些信息?如果您处于我的位置,并且javassist JAR发生冲突,您会怎么做?首先,我会尝试检查相关项目站点是否有此类信息可用。如果没有,我会尝试在他们各自的邮件列表中询问。。。此外,我会尝试选择一个javaassist,并完全测试我的应用程序(完全后悔)。。。如果没有出现错误或异常(链接到hibernate/javaassist或jersey/javaassist),那么该版本库很可能成为winner库…如果javassist JAR发生冲突,我将探索以下选项:一、找到使用相同javaasist的hibernate版本和jersey版本,并允许我以最小的更改运行代码。第二,验证我为什么需要jersey和hibernate在一起,我可以将使用hibernate的类与使用jersey的类分开,并将它们公开为服务吗??第三,看看如何使用独立的类加载器调用hibernate和jersey(这非常困难,但是有一些项目解决了这类问题,例如:JBoss模块)