具体来说,我只使用 spring 来通过 ApplicationContext 配置我的项目。在我的 spring xml 中,我通过 PropertyPlaceholderConfigurer 加载了一些 bean 属性。每当在依赖项中我将 commons-logging-xx 与 jcl-slf4j.jar 交换时,上下文的加载都会失败,并且在占位符替换上出现 ClassNotFoundExceptions。例子:
在我的 spring.xml 中有:
<bean id="testbean" class="${testbean.implementingClass}"/>
其中 testbean.implementingClass 在 spring.properties 中定义:
testbean.implementingClass=my.implementation.TestClass
如果我使用 commons-logging jar 运行该项目,则一切正常。如果我将其更改为 jcl-slf4j,那么我会得到 ClassNotFoundException 类 [${testbean.implementingClass}] 未找到,即它不执行占位符替换。有没有人观察到这一点?
编辑:我的问题与罐子无关,因为:来自http://www.slf4j.org/legacy.html:
我们的 JCL over SLF4J 实现将允许您逐步迁移到 SLF4J,特别是如果您的软件所依赖的某些库在可预见的未来继续使用 JCL。您可以立即享受 SLF4J 的可靠性带来的好处,同时保持向后兼容性。只需将 commons-logging.jar 替换为 jcl-over-slf4j.jar。随后,底层日志框架的选择将由 SLF4J 而不是 JCL 来完成,但没有困扰 JCL 的类加载器问题。底层日志框架可以是 SLF4J 支持的任何框架。通常,将 commons-logging.jar 替换为 jcl-over-slf4j.jar 将立即永久解决与公共日志记录相关的类加载器问题。