尝试从INI资源启动Shiro SecurityManager时遇到java.lang.ClassNotFoundException:org.apache.commons.logging.LogFactory

时间:2017-08-23 05:55:57

标签: slf4j log4j2 shiro apache-commons-logging

我刚刚开始试用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的核 - 2.8.2.jar
  • 的log4j-SLF4J-IMPL-2.8.2.jar
  • SLF4J-API-1.7.25.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.jarjcl-over-slf4j-1.7.25.jar(我收集的文件类似于&#34;提供范围&#34;来自网站的指令)但是没有#&# 39;解决异常。

我还尝试在我的lib文件夹中加入log4j-jcl-2.8.2.jar,但同样的例外情况仍然没有消失。

非常感谢任何帮助和指导。提前致谢!欢呼声。

1 个答案:

答案 0 :(得分:0)

使用shiro-web时,我遇到了同样的错误。由于您已经使用了slf4j,因此只需将运行时依赖项添加到jcl-over-slf4j即可。我刚刚做了,它解决了异常。如果你仍然得到错误,那么你没有做正确的事情 - 例如将罐放在正确的位置,......

不要在jcl网桥中包含commons-logging。使用jcl桥到slf4j或使用commons-logging都没有多大意义。