26

我有一个 Web 应用程序,其中的依赖项拉入两个名为:

  1. javassist-3.9.0.GA.jar
  2. javassist-3.20.0-GA.jar

当我将 WAR 打包在 WEB-INF/lib 目录中时,我的问题是应用程序正在运行以及为什么我不会遇到任何问题,因为显然我在两个 jar 中都有相同的类并且应该有问题对?

4

2 回答 2

34

对于 Java,提供多少版本的类并不重要。默认类加载器只会选择它可以找到的类路径中的第一个。

由于您可以无错误地运行应用程序,这意味着以下情况之一:

  • 如果 javassist-3.9.0.GA.jar 在类路径中首先出现:您的应用程序不依赖于 javassist-3.20.0-GA.jar 中的新 API 或错误修复此外,您使用的该库的 API 在这些版本之间没有更改(库不应该在次要版本之间做的事情)

  • 如果 javassist-3.20.0-GA.jar 在类路径中首先出现:该库向后兼容

我建议:

  • 如果这些依赖项是应用程序不同部分的直接依赖项,请确保您在任何地方都使用相同的版本。最好的方法是在父 POM 的 dependencyManagement 部分中修复版本,然后在 dependencies 部分中省略 version 属性。
  • 如果这些依赖项是传递依赖项,则排除您不想使用的依赖项,以确保您在最终应用程序中只有一个版本的库。还可以考虑为仍然使用旧版本的项目提交问题并要求他们升级依赖项的版本。
  • 如果您需要使用同一个库的两个不兼容版本,它们具有相同的包名和类名,请考虑使用诸如 OSGi 之类的模块系统,它在一定程度上支持运行同一个库的不同版本。
于 2016-02-13T15:26:57.147 回答
6

回答“任何建议如何解决它?” 看看使用依赖树解决冲突。使用该命令mvn dependency:tree,您将能够知道任何依赖项的来源。当您知道哪些工件依赖于 javassist 时,您可以添加一个排除条目以避免使用其中一个 javassist 版本。

于 2016-02-13T17:43:12.330 回答