【发布时间】:2018-01-31 13:36:37
【问题描述】:
刚开始试用Shiro,在尝试SecurityManager from an INI resource的代码时遇到
java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
扩展信息:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.commons.beanutils.ConvertUtilsBean.<init>(ConvertUtilsBean.java:154)
at org.apache.commons.beanutils.BeanUtilsBean.<init>(BeanUtilsBean.java:113)
at org.apache.commons.beanutils.BeanUtilsBean$1.initialValue(BeanUtilsBean.java:64)
at org.apache.commons.beanutils.BeanUtilsBean$1.initialValue(BeanUtilsBean.java:60)
at org.apache.commons.beanutils.ContextClassLoaderLocal.get(ContextClassLoaderLocal.java:154)
at org.apache.commons.beanutils.BeanUtilsBean.getInstance(BeanUtilsBean.java:76)
at org.apache.commons.beanutils.PropertyUtilsBean.getInstance(PropertyUtilsBean.java:107)
at org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptor(PropertyUtils.java:498)
at org.apache.shiro.config.ReflectionBuilder.isTypedProperty(ReflectionBuilder.java:409)
at org.apache.shiro.config.ReflectionBuilder.applyProperty(ReflectionBuilder.java:702)
at org.apache.shiro.config.ReflectionBuilder.applySingleProperty(ReflectionBuilder.java:364)
at org.apache.shiro.config.ReflectionBuilder.applyProperty(ReflectionBuilder.java:325)
at org.apache.shiro.config.ReflectionBuilder$AssignmentStatement.doExecute(ReflectionBuilder.java:955)
at org.apache.shiro.config.ReflectionBuilder$Statement.execute(ReflectionBuilder.java:887)
at org.apache.shiro.config.ReflectionBuilder$BeanConfigurationProcessor.execute(ReflectionBuilder.java:765)
at org.apache.shiro.config.ReflectionBuilder.buildObjects(ReflectionBuilder.java:260)
at org.apache.shiro.config.IniSecurityManagerFactory.buildInstances(IniSecurityManagerFactory.java:167)
at org.apache.shiro.config.IniSecurityManagerFactory.createSecurityManager(IniSecurityManagerFactory.java:130)
at org.apache.shiro.config.IniSecurityManagerFactory.createSecurityManager(IniSecurityManagerFactory.java:108)
at org.apache.shiro.config.IniSecurityManagerFactory.createInstance(IniSecurityManagerFactory.java:94)
at org.apache.shiro.config.IniSecurityManagerFactory.createInstance(IniSecurityManagerFactory.java:46)
at org.apache.shiro.config.IniFactorySupport.createInstance(IniFactorySupport.java:123)
at org.apache.shiro.util.AbstractFactory.getInstance(AbstractFactory.java:47)
at core.Server.testShiro(Server.java:121)
at core.Server.main(Server.java:57)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 25 more
core.Server.testShiro(Server.java:121) 所说的我的代码是:
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
我的猜测是,我在上一行代码 Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 中指定的 shiro.ini 文件存在一些问题,根据错误消息,似乎 beanutils 是需要 org.apache.commons.logging.LogFactory 的库类
我的问题不是如何纠正 shiro.ini,而是如何解决 ClassNotFoundException。
请注意,我使用的是 log4j2,并且已经在我的库中包含了 log4j2 jar,以及 slf4j 桥接适配器(我的理解是 Shiro 需要这些)jar:
- log4j-api-2.8.2.jar
- log4j-core-2.8.2.jar
- log4j-slf4j-impl-2.8.2.jar
- slf4j-api-1.7.25.jar
还有 Hibernate jars
我进行了一些搜索,看到了 Les Hazlewood 对 Shiro 用户网站问题 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 的回复以查看 explicitly excluding JCL。定向站点中所述的三个选项并不真正适用,因为我没有使用 Maven 化的项目,只是 Netbeans 中的一个独立 Java 项目。但是,我尝试在我的 lib 文件夹中包含 commons-logging-1.2.jar 和 jcl-over-slf4j-1.7.25.jar(我收集到的内容类似于网站上的“提供范围”指令),但这并不能解决异常。
我也尝试在我的 lib 文件夹中包含 log4j-jcl-2.8.2.jar,但同样的异常仍然没有消失。
任何帮助和指导将不胜感激。提前致谢!干杯。
【问题讨论】:
标签: slf4j log4j2 shiro apache-commons-logging