java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

时间:2022-02-28 17:25:50

在学习Spring实战的时候碰到了这么一个问题,觉得非常奇怪。我在pom.xml中是添加了所需要的依赖包的,而且在maven-repository里头肉眼去看了,也是发现了这个对应依赖包下存在org/hamcrest/SelfDescribing。搞了3天终于查出了原因。


看我使用IDEA运行的时候,控制台的执行命令:

"C:\Program Files\Java\jdk1.7.0_51\bin\java" -ea -Didea.launcher.port=7540 "-Didea.launcher.bin.path=C:\Program Files\JetBrains\IntelliJ IDEA 12.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 12.1.4\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 12.1.4\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\access-bridge.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\junit.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\lucene-analyzers-common-4.6.1.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\lucene-core-4.6.1.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\tools.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\zipfs.jar;D:\书籍\正在看的\Spring实战(第3版)-code\springidol-aop\target\test-classes;D:\书籍\正在看的\Spring实战(第3版)-code\springidol-aop\target\classes;D:\maven-repository\org\springframework\spring-context\3.2.0.RELEASE\spring-context-3.2.0.RELEASE.jar;D:\maven-repository\org\springframework\spring-core\3.2.0.RELEASE\spring-core-3.2.0.RELEASE.jar;D:\maven-repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;D:\maven-repository\org\springframework\spring-aop\3.2.0.RELEASE\spring-aop-3.2.0.RELEASE.jar;D:\maven-repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;D:\maven-repository\org\springframework\spring-beans\3.2.0.RELEASE\spring-beans-3.2.0.RELEASE.jar;D:\maven-repository\org\springframework\spring-expression\3.2.0.RELEASE\spring-expression-3.2.0.RELEASE.jar;D:\maven-repository\org\springframework\spring-aspects\3.2.0.RELEASE\spring-aspects-3.2.0.RELEASE.jar;D:\maven-repository\org\aspectj\aspectjweaver\1.6.2\aspectjweaver-1.6.2.jar;D:\maven-repository\org\springframework\spring-context-support\3.2.0.RELEASE\spring-context-support-3.2.0.RELEASE.jar;D:\maven-repository\org\aspectj\aspectjrt\1.6.2\aspectjrt-1.6.2.jar;D:\maven-repository\org\springframework\spring-test\3.2.0.RELEASE\spring-test-3.2.0.RELEASE.jar;D:\maven-repository\org\springframework\spring-webmvc\3.2.0.RELEASE\spring-webmvc-3.2.0.RELEASE.jar;D:\maven-repository\org\springframework\spring-web\3.2.0.RELEASE\spring-web-3.2.0.RELEASE.jar;D:\maven-repository\junit\junit\4.6\junit-4.6.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 com.springinaction.springidol.AspectTest


原来,我以前在刚开始接触java的时候,看的一个网上的Web开发,他建议我添加依赖包的一种方式是直接在JAVA_HOME下的jre\lib\ext目录添加所需要的jar包,考虑到那时候不会使用IDE开发区工具,直接在cmd下敲,确实很方便。但这给我目前使用maven添加依赖的方式产生了冲突。

原因是这样的,Intellij IDEA在标注的classpath下找junit-4.6.jar时,策略是:

1.在JAVA_HOME下的jre\lib\ext下找到了junit.jar,就没有再往下查找,而且这一步也没有核对版本号。

2.如果第一步查找失败,就会根据pom.xml的中的依赖按照版本号从maven-repository下查找

考虑到我的jre\lib\ext下有junit.jar,而里头又没有org/hamcrest/SelfDescribing,所以就报错了。


这里值得提一下的是,我报错用的IDE工具是Interllij IDEA,而后来尝试使用Eclipse,发现居然没有抛出异常。这个的原因可能在于不同的IDE开发工具在处理这种包冲突的时候会采取不同的策略。


解决办法就是:删除了JAVA_HOME的jre\lib\ext下手动添加的一些jar包,采用maven的添加方式。原因有2个:

1.这里添加的会对所有的项目产生影响

2.排错过程太难,因为太隐蔽了