我运行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。然后,在查看父级之前,这将加载应用程序类加载器中的所有内容。这应该可以解决这类问题,假设您有类似的设置。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top