我刚刚开始试用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:
以及Hibernate jar
我已经做了一些搜索,并看到了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
(我收集的文件类似于&#34;提供范围&#34;来自网站的指令)但是没有#&# 39;解决异常。
我还尝试在我的lib文件夹中加入log4j-jcl-2.8.2.jar
,但同样的例外情况仍然没有消失。
非常感谢任何帮助和指导。提前致谢!欢呼声。
答案 0 :(得分:0)
使用shiro-web时,我遇到了同样的错误。由于您已经使用了slf4j,因此只需将运行时依赖项添加到jcl-over-slf4j即可。我刚刚做了,它解决了异常。如果你仍然得到错误,那么你没有做正确的事情 - 例如将罐放在正确的位置,......
不要在jcl网桥中包含commons-logging。使用jcl桥到slf4j或使用commons-logging都没有多大意义。