了解Maven依赖树输出

时间:2016-07-02 00:48:53

标签: spring maven maven-dependency

我正在尝试编译一个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>

问题:我不明白这个输出是说一切都很好,或者我的项目中可能存在一些不兼容性,以及是否有解决方法?

1 个答案:

答案 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>

如上所述将解决所有版本的可比性问题,并且应用程序正常工作,因为我们不会使用不匹配的版本