1
57
LinkageError是一个典型的例子,在这种情况下,类C由多个类加载器加载,并且这些类在同一代码(比较、转换等)中一起使用。不管它是同一个类名还是从同一个jar加载的类——如果从另一个类加载程序加载,来自一个类加载程序的类总是被视为不同的类。 这条信息(多年来改善了很多)说:
因此,这里的问题在于解决svgomdocument.createAttribute()方法,该方法使用org.w3c.dom.attr(标准dom库的一部分)。但是,使用batik加载的attr版本是从与您要传递给方法的attr实例不同的类加载器加载的。 你会看到蜡染的版本似乎是从Java插件加载的。而您的服务器正从“”加载,这很可能是内置的JVM加载程序之一(引导类路径、ESOM或类路径)。 三个突出的类加载器模型是:
我不知道JPF类加载器使用什么委托策略,但关键是您希望加载一个版本的DOM库,并且每个人都从同一位置来源代码该类。这可能意味着将它从类路径中移除并作为插件加载,或者阻止batik加载它,或者其他什么。 |
2
15
听起来像是一个类加载器层次结构问题。我不知道您的应用程序部署在哪种类型的环境中,但有时这个问题会发生在Web环境中——在Web环境中,应用程序服务器创建一个类加载器层次结构,类似于:
javahome/lib-作为根目录
通常,类加载器将加载委托给其父类加载器(这称为
在Web环境中,您可能会遇到此层次结构的问题。例如,我以前遇到的一个错误/问题是WEB-INF/LIB中的类依赖于APPServer/LIB中部署的类,而APPServer/LIB又依赖于WEB-INF/LIB中部署的类。这导致了失败,因为当类加载器能够委托给父类加载器时,它们不能委托回树。因此,WEB-INF/lib类加载器将向appserver/lib类加载器请求类,appserver/lib类加载器将加载该类并尝试加载依赖类,但由于在appserver/lib或javahome/lib中找不到该类,因此失败。 因此,虽然您可能没有在Web/AppServer环境中部署您的应用程序,但如果您的环境设置了类加载器层次结构,我的过长解释可能适用于您。是吗?JPF是否在做一些类加载器魔术,以便能够实现它的插件功能? |
3
6
也许这能帮助别人,因为它对我很好。这个问题可以通过集成您自己的依赖关系来解决。遵循以下简单步骤 首先检查错误如下:
|
4
5
你能指定一个类加载器吗?如果没有,请尝试这样指定上下文类加载器:
我不熟悉Java插件框架,但是我编写了Eclipse的代码,我时常遇到类似的问题。我不保证它能修好,但可能值得一试。 |
5
3
亚历克斯和马特的回答很有帮助。我也可以从他们的分析中获益。 在netbeans RCP框架中使用batik库时,我也遇到了同样的问题,batik库作为“库包装模块”包含在其中。如果其他一些模块使用了XML API,并且该模块不需要依赖BATIK,那么类加载器约束冲突问题会出现类似的错误消息。 在NetBeans中,各个模块使用专用的类加载器,模块之间的依赖关系意味着合适的类加载器委托路由。 我可以通过省略batik库包中的xml apis jar文件来解决这个问题。 |