Java 弹簧靴罐地狱

Java 弹簧靴罐地狱,java,spring,spring-boot,Java,Spring,Spring Boot,在Spring Boot应用程序中调用第三方库时,我遇到了多个问题。问题的根本原因似乎是Spring Boot带来了很多依赖项,它们可能会与我的第三方库发生冲突。一个具体的例子是 将引导引入依赖项a A引入了依赖项B(版本1.1) 我在Spring启动应用程序中运行的代码引入了第三方依赖项C。请注意,C及其依赖项打包到一个jar中 C引入依赖项B(1.0版) 在运行时,C失败,因为加载的是B(版本1.1),而不是B(版本1.0)。我知道.NET通过对程序集进行版本控制解决了“DLL地狱”。如何在

在Spring Boot应用程序中调用第三方库时,我遇到了多个问题。问题的根本原因似乎是Spring Boot带来了很多依赖项,它们可能会与我的第三方库发生冲突。一个具体的例子是

  • 将引导引入依赖项a
  • A引入了依赖项B(版本1.1)
  • 我在Spring启动应用程序中运行的代码引入了第三方依赖项C。请注意,C及其依赖项打包到一个jar中
  • C引入依赖项B(1.0版)

  • 在运行时,C失败,因为加载的是B(版本1.1),而不是B(版本1.0)。我知道.NET通过对程序集进行版本控制解决了“DLL地狱”。如何在Java中修复这个Jar地狱?

    使用maven管理您的依赖关系。然后你可以强制一个版本。我的项目正在使用Maven。请注意,我并不直接依赖于B(1.0版)。我的直接依赖关系是C,而不是B,因此我无法指定B使用的是哪个版本。那简直是地狱。如果您使用Intellij idea,您可以使用maven依赖关系图查看jar中有多少项,然后将其排除在外。难的答案是:使用模块。无论是OSGI捆绑包,还是使用Java9或更高版本,都可以使用内置模块支持。更可能的是,解决方案更简单,依赖性地狱也可以解决,例如升级C。我不会把你的问题变成一个伪例子,用实际存在问题的库替换a、B和C。我可以升级C,但我如何知道a引入的B的确切版本?运行“mvn dependency:tree”只直接显示Spring引导引入的依赖项(A由Spring引导直接引入,而不是B)。