0

我正在开发一个 Web 项目,该项目有 2 个不同的依赖项被拉入同一类的 war 文件(不同版本,不同包)

一个是:com.google.common.collect,另一个是 Guava API 包。当我在 websphere 应用程序服务器上运行此服务时,它会在 ImmutableList.copyOf 处引发 NoSuchMethodFound 异常。它显然是在加载早期的类,而不是来自 Guava 的具有所需功能的类。

我无法更改任何依赖项,我怎么可能通过其他使用 maven 来覆盖特定的依赖项?

我应该如何解决这个问题?

4

2 回答 2

0

使用在类路径中找到的第一个匹配的类。因此,如果您可以以不同的方式指定类路径来尝试影响拾取的类。(即指定要在类路径中首先加载的类)。这不是一个好的做法,因为 Java 规范不保证使用类路径顺序。

更好的解决方案是在代码中自己管理类加载。这可以通过

`ClassLoader myClassLoader = new MyClassLoader(libPath);
 Object1 obj1 = myClassLoader .loadClass("com.google.common.collect", true);'

现在,如果类加载器尝试从库中加载类,则依赖类将由同一个类加载器加载,该类加载器无权访问其他库和依赖项。

注意:如果您使用它并希望将来迁移到 OSGi,您将不得不删除此代码,这会带来一些痛苦。因此尽量限制它的使用或尽早切换到 OSGi!

于 2013-04-16T10:39:21.470 回答
0

If you have control over the WebSphere installation, you can also try this:

locate the jre lib directory of your application server (/WebSphere/AppServer/java/jre/lib) create a directory 'endorsed' put your required jars into this directory( Guava API).

The jars in this directory will be loaded first and override what you have in you war file.

This is not recommended but you can use it as patch to override the conflicting classes.

于 2013-04-15T19:28:19.963 回答