首先,关于NoClassDefFoundError这个问题是什么,可以参照这里
在上面有关NoClassDefFoundError这个错误,有这么一段话:
NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在J2EE的环境下工作,并且得到NoClassDefFoundError的异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。
我今天就遇到了这个错误,一个很简单的切面的问题,测试时报错NoClassDefFoundError,最终原因是少了aspectjweaver
的jar包,但是我的pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>BeanAssemble</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
</dependencies>
</project>
我本以为有了aspectjrt这个包之后就万事大吉了,却没想到还会出现如此的错误。
那么aspectjrt和aspectjweaver又有什么联系和区别呢?
首先,Spring的Aop本身就是通过AspectJ实现的,然而在Spring较高版本(大概在3.0)之后,就不再一起发布以来包了,而是将aspectjweaver作为可选依赖引入,所以说Spring Aop依赖aspectj来实现。
上面解释了NoClassDefFoundError错误出现的原因,本质就是缺少依赖包。
那为什么我导入了asperjrt这个包不行呢?
在maven搜索aspectj出现如下两条:
这两个有什么关系呢?
我找到了如下的解释:
Spring-aspects 实现类似 aspectj 注解方式的时候,借用了 aspectjweaver.jar 中定义的一些annotation 和 class,然而其并不使用 Aspectj 的字节码织入功能。
好了,归根结底,我的解决方法是导入了aspectjweaver.jar!