我运行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库。建议?
答案 0 :(得分:3)
看看SLF4J。
答案 1 :(得分:0)
不熟悉iplanet,但在WebSphere中,您可以将应用程序类加载策略设置为PARENT_LAST。然后,在查看父级之前,这将加载应用程序类加载器中的所有内容。这应该可以解决这类问题,假设您有类似的设置。
这意味着您必须在自己的应用程序中提供所有依赖项(无论如何这都是最佳实践)。
答案 2 :(得分:0)
您是否明确地将公共日志记录在类路径中?你说的是jvm classpath,所以我假设你在启动iPlanet时在命令行中指定它。这不是在J2EE应用程序中加载jar的推荐方法。
最简单的方法就是让Apache库使用iPlanet附带的commons日志jar。不要将commons-logging.jar放在WEB-INF / lib目录或任何类路径设置中,并且应自动拾取iPlanet。