我正在尝试编译一个Spring应用程序,其中ApplicationConfig
文件有@EnableAspectJAutoProxy anotation
我在尝试运行项目时遇到此错误:
Failed to instantiate [org.springframework.aop.aspectj.annotation.
AnnotationAwareAspectJAutoProxyCreator]:
Constructor threw exception; nested exception is
java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around
我必须说当我删除上面的注释时项目正在成功运行。
在互联网上阅读后,我想也许是因为库和jar文件的版本不兼容。
当我运行mvn dependency:tree
时,输出如下:
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] groupId:myProject:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:compile
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:compile
[INFO] +- org.springframework:spring-webmvc:jar:4.3.0.RELEASE:compile
[INFO] | +- org.springframework:spring-aop:jar:4.2.6.RELEASE:compile (version m
anaged from 4.3.0.RELEASE)
[INFO] | | \- aopalliance:aopalliance:jar:1.0:compile
[INFO] | +- org.springframework:spring-beans:jar:4.2.6.RELEASE:compile
[INFO] | +- org.springframework:spring-context:jar:4.2.6.RELEASE:compile (versi
on managed from 4.3.0.RELEASE)
[INFO] | +- org.springframework:spring-core:jar:4.2.6.RELEASE:compile
[INFO] | +- org.springframework:spring-expression:jar:4.2.6.RELEASE:compile
[INFO] | \- org.springframework:spring-web:jar:4.2.6.RELEASE:compile (version m
anaged from 4.3.0.RELEASE)
[INFO] +- org.aspectj:aspectjweaver:jar:1.8.9:compile
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:compile
[INFO] \- org.aspectj:aspectjrt:jar:1.8.9:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
这是pom.xml
文件的内容:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
</dependencies>
问题:我不明白这个输出是说一切都很好,或者我的项目中可能存在一些不兼容性,以及是否有解决方法?
答案 0 :(得分:0)
如果您在项目中使用maven进行依赖关系管理,那么您必须至少遇到一次问题或者可能不止这样。问题是版本不匹配。它通常发生在你有一些依赖关系,它将相关的依赖关系与某个版本结合在一起。如果您已经包含了具有不同版本号的依赖项,那么它们在编译时和运行时也会遇到不希望的结果。
理想情况下,为了避免上述问题,您需要明确排除相关的依赖关系,但很可能您忘记这样做。
要解决版本不匹配问题,您可以使用“物料清单”(BOM)相关性的概念。 BOM依赖关系跟踪版本号并确保所有依赖项(直接和传递)都处于同一版本。
如何添加BOM [物料清单]依赖
Maven为此提供了标签依赖性管理。您需要在此标记中添加bom信息,如下所示。我以Spring bom文件为例。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
使用BOM的另一个好处是,在依赖Spring Framework工件时,您不再需要指定版本属性。所以它会完美无缺。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependencies>
如上所述将解决所有版本的可比性问题,并且应用程序正常工作,因为我们不会使用不匹配的版本