如何解决这个无效的类加载器层次结构?
-
06-07-2019 - |
题
我运行iPlanet的Java应用服务器,其中包含 commons-logging-1.0.4.jar
。
直到我的一个应用程序调用 AuthSSLProtocolSocketFactory
,这是另一个也使用 commons-logging
的apache库。
我把jar放在jvm类路径上并得到这个错误:
无效的类加载器层次结构。您可以看到多个版本的'org.apache.commons.logging.Log',这是不允许的。 (由org.apache.commons.logging.LogConfigurationException引起:无效的类加载器层次结构......
似乎 commons-logger
不喜欢在不同的类加载器中加载自己的两个实例。我假设应用程序服务器有自己的类加载器,它第一次加载它(虽然我找不到任何提到它的appserver配置)所以当我的应用程序第二次加载它时会抛出异常。
我无法更改Web服务器,也无法更改apache库。建议?
解决方案
您是否明确地将公共日志记录在类路径中?你说jvm classpath,所以我假设你在启动iPlanet时在命令行上指定它。这不是在J2EE应用程序中加载jar的推荐方法。
最简单的方法就是让Apache库使用iPlanet附带的commons日志jar。不要将commons-logging.jar放在WEB-INF / lib目录或任何类路径设置中,并且应自动拾取iPlanet。
其他提示
查看 SLF4J 。
此外, http://www.qos.ch/logging/classloader.jsp 会有所帮助。
不熟悉iplanet,但在WebSphere中,您可以将应用程序类加载策略设置为PARENT_LAST。然后,在查看父级之前,这将加载应用程序类加载器中的所有内容。这应该可以解决这类问题,假设您有类似的设置。
这意味着您必须在自己的应用程序中提供所有依赖项(无论如何这都是最佳实践)。