如何解决这个无效的类加载器层次结构?

时间:2009-05-06 14:43:21

标签: java apache logging classloader

我运行iPlanet的Java应用服务器,其中的一些内容正在加载commons-logging-1.0.4.jar

在我的某个应用程序调用{​​{1}}之前没问题,这是另一个也使用AuthSSLProtocolSocketFactory的apache库。

我把jar放在jvm类路径上并得到这个错误:

  

commons-logging

似乎Invalid class loader hierarchy. You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy....不喜欢在不同的类加载器中加载自己的两个实例。我假设应用程序服务器有自己的类加载器,它第一次加载它(虽然我找不到任何提到它的appserver配置)所以当我的应用程序第二次加载它时会抛出异常。

我无法更改Web服务器,也无法更改apache库。建议?

3 个答案:

答案 0 :(得分:3)

看看SLF4J

此外,http://www.qos.ch/logging/classloader.jsp 会有所帮助。

答案 1 :(得分:0)

不熟悉iplanet,但在WebSphere中,您可以将应用程序类加载策略设置为PARENT_LAST。然后,在查看父级之前,这将加载应用程序类加载器中的所有内容。这应该可以解决这类问题,假设您有类似的设置。

这意味着您必须在自己的应用程序中提供所有依赖项(无论如何这都是最佳实践)。

答案 2 :(得分:0)

您是否明确地将公共日志记录在类路径中?你说的是jvm classpath,所以我假设你在启动iPlanet时在命令行中指定它。这不是在J2EE应用程序中加载jar的推荐方法。

最简单的方法就是让Apache库使用iPlanet附带的commons日志jar。不要将commons-logging.jar放在WEB-INF / lib目录或任何类路径设置中,并且应自动拾取iPlanet。