我正在开发一个Web项目,该项目有2个不同的依赖项被拉入同一类的war文件中 (不同版本,不同包装)
一个是: com.google.common.collect,另一个是Guava API包。当我在websphere应用程序服务器上运行此服务时,它会在ImmutableList.copyOf处抛出NoSuchMethodFound Exception。它显然是加载了早期的类而不是具有所需功能的Guava的类。
我无法改变任何依赖关系,我怎么可能使用maven覆盖其他人的特定依赖?
我该如何解决这个问题?
答案 0 :(得分:0)
如果您可以控制WebSphere安装,也可以尝试:
找到应用程序服务器的jre lib目录(/ WebSphere / AppServer / java / jre / lib) 创建一个目录'endorsed'将你需要的jar放入这个目录(Guava API)。
首先加载此目录中的jar并覆盖war文件中的内容。
不建议这样做,但您可以将其用作补丁来覆盖冲突的类。
答案 1 :(得分:0)
使用在类路径中找到的第一个匹配类。因此,如果您可以以不同的方式指定类路径,以尝试影响拾取的类。 (即指定要在类路径中首先加载的类)。这不是一个好习惯,因为Java规范不保证使用classpath顺序。
更好的解决方案是在代码中自己管理类加载。这可以通过
来完成`ClassLoader myClassLoader = new MyClassLoader(libPath);
Object1 obj1 = myClassLoader .loadClass("com.google.common.collect", true);'
现在,如果类加载器尝试从库加载类,则依赖类将由无法访问其他库和依赖项的同一类加载器加载。
注意:如果您使用此功能并希望将来转移到OSGi,您将不得不删除此代码。因此,尽量限制它的使用或尽早切换到OSGi!