3

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

这很好,直到我的一个应用程序调用AuthSSLProtocolSocketFactory它是另一个也使用commons-logging.

我将 jar 放在 jvm 类路径上并收到此错误:

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....

似乎commons-logger不喜欢在不同的类加载器中加载自身的两个实例。我假设应用程序服务器有自己的类加载器,它第一次加载它(虽然我找不到任何提到它的 appserver 配置)所以当我的应用程序第二次加载它时它会抛出该异常。

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

4

3 回答 3

3

看看SLF4J

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

于 2009-05-06T14:55:43.147 回答
0

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

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

于 2009-05-06T17:09:01.720 回答
0

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

最简单的事情是让 Apache 库使用 iPlanet 附带的公共日志记录 jar。不要将 commons-logging.jar 放在您的 WEB-INF/lib 目录或任何类路径设置中,iPlanet 应该会被自动拾取。

于 2009-06-26T14:01:37.610 回答