【问题标题】:Understanding Maven Dependency tree output了解 Maven 依赖树输出
【发布时间】:2016-07-02 00:48:52
【问题描述】:

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

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

【问题讨论】:

    标签: spring maven maven-dependency


    【解决方案1】:

    如果您曾在项目中使用 maven 进行依赖管理,那么您一定至少遇到过一个问题,或者可能不止一次。问题是版本不匹配。它通常发生在您有一些依赖项将其相关依赖项与某个版本结合在一起时。而且,如果您已经包含了具有不同版本号的那些依赖项,它们可能会在编译时和运行时面临不希望的结果。

    理想情况下,为避免上述问题,您需要明确排除相关依赖项,但您很可能会忘记这样做。

    要解决版本不匹配问题,您可以使用“物料清单” (BOM) 依赖项的概念。 BOM 依赖项跟踪版本号并确保所有依赖项(直接和传递)都处于同一版本。

    如何添加 BOM [Bill Of Materials] 依赖项

    Maven为此提供了一个标签dependencyManagement。您需要在此标签中添加 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>
    

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

    【讨论】:

    • 感谢您的回答,但我正在寻找一个可以帮助我让当前代码正常工作而不是从头开始更改所有内容的答案
    • 您只需要在 pom.xml 中进行更改,我相信它会解决不兼容问题,因为您总是获得兼容的版本
    • @rajadilipolli 所以你能把我的 pom.xml 文件的新版本放在答案中吗?我会测试它,如果它有效,我可以把它作为正确的答案
    • 在您的依赖项标签顶部复制并粘贴我在答案中提交的材料清单 BOM 代码,然后从其中的每个依赖项中删除版本标签,它将解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2014-04-16
    • 2016-03-04
    • 2017-09-13
    • 2014-07-20
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多