【问题标题】:Exception java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Aspect异常 java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Aspect
【发布时间】:2016-05-25 09:19:08
【问题描述】:

我最近开始研究AspectJ 并编写了一个简单的日志记录方面。

我在 pom 文件中定义了以下依赖项:

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>

ear/lib 文件夹中存在以下工件:

  • aspectjrt-1.7.1.jar
  • aspectjweaver-1.7.1.jar
  • spring-aspects-3.2.1.RELEASE.jar

我在服务启动时遇到异常。:

05:59:18,325 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-15) Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'calNamingBean' defined in ServletContext resource [/WEB-INF/helixservicebeans.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Aspect
                    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) [spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) [spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) [spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) [spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:740) [spring-context-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:449) [spring-context-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385) [spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) [spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) [spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.17.Final.jar:]
                    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.17.Final.jar:]
                    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:89) [jboss-as-web-7.1.3.Final.jar:7.1.3.Final]
                    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
                    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45]
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45]
                    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45]
            Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Aspect
                    at org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactory.hasAspectAnnotation(AbstractAspectJAdvisorFactory.java:119) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactory.isAspect(AbstractAspectJAdvisorFactory.java:115) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.isInfrastructureClass(AnnotationAwareAspectJAutoProxyCreator.java:100) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:278) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
                    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:880) [spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE]

编辑 1 - 我正在使用 JBOSS 7.1,我认为 AspejctJJBOSS 存在一些问题。

https://stackoverflow.com/questions/33164216/load-time-weaving-with-aspectj-in-jboss-as-7-1

【问题讨论】:

  • 我已经完成了问题及其答案。没有运气。在本地,我可以使用相同的配置运行,但是当我将它部署到 JBoss 服务器时它会失败。
  • 不好的建议:如果使用war,请尝试在部署单元中打包aspectJ的jar,例如WEB-INF/lib/。有时执行环境不提供运行时依赖的类文件作为服务。如果它运行比您知道问题并使用正确的方式修复它。还要检查是否需要将 aspecJ 包中的任何类声明为 bean。我也面临与休眠类似的问题。我强行打包了jar,它就跑了。
  • 你的申请是什么?您是否使用了快速入门或有一段简单的代码示例?

标签: java spring aop aspectj spring-aop


【解决方案1】:

maven 项目中像这样的 NoClassDefFoundError 通常来自库冲突。问题中的信息不足,您只提供了 pom 的 sn-p 并且没有显示您正在使用的 spring 方面的版本。您需要运行 mvn dependency:tree 并验证您使用的所有 aspectj 依赖项的版本号一致。

编辑:肯定存在某种库冲突,因为您在问题中提到了 spring-aspects 3.2.1.RELEASE,但堆栈跟踪包含很多对 spring 3.1.1 的引用。发布库。

【讨论】:

  • 没有冲突。我已经验证过了。
  • 您的问题可能有错字,或者您的库版本存在冲突。你不应该有任何 3.1.1.RELEASE 版本的库(比如在你的堆栈跟踪中)和 3.2.1.RELEASE 版本的 spring aspect。
【解决方案2】:

java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Aspect

似乎在运行时没有从classpath 加载包含org.aspectj.lang.annotation.Aspect 类的jar,您可以尝试删除以下依赖项吗:

 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-aspects</artifactId>
 </dependency>

并在您的类路径中添加以下内容:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>3.2.1.RELEASE</version>
</dependency>

【讨论】:

  • 这是不必要的,spring-aspects依赖于spring-aop。 Maven 无需您的编辑即可将其引入。此外,Aspect 也没有丢失。他没有得到 NoClassFoundException,这意味着它丢失了,他得到了一个 NoClassDefFoundError,这意味着该类没有被加载。
【解决方案3】:

回答您的问题

  1. 如果您使用Spring 3.2.1.RELEASE,请将您的组ID 更改为net.anthavio.maven,我发现只有aspectjweaver.1.7.4.jar 文件作为依赖项呈现。请将您对 aspectjweaver 的依赖更改为 1.7.4 版本。
  2. 始终建议您在使用 Spring 3.X 及更高版本时使用物料清单。
  3. 我已经给出了一个示例 POM,您可以进行相应的验证以与您现有的 POM 匹配。

                                        <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>com.yourcompany.app</groupId>
                                        <artifactId>springBOM</artifactId>
                                        <version>0.0.1-SNAPSHOT</version>
    
                                        <dependencyManagement>
                                            <dependencies>
                                                <dependency>
                                                    <groupId>org.springframework</groupId>
                                                    <artifactId>spring-framework-bom</artifactId>
                                                    <version>3.2.10.RELEASE</version>
                                                    <type>pom</type>
                                                    <scope>import</scope>
                                                </dependency>
                                            </dependencies>
                                        </dependencyManagement>
                                        <dependencies>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-aop</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-aspects</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-beans</artifactId>
                                         </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-context</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-context-support</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-core</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-expression</artifactId>
                                        </dependency>
    
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-jdbc</artifactId>
                                        </dependency>
    
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-orm</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-oxm</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-test</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-tx</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-web</artifactId>
                                        </dependency>
                                        <dependency>
                                            <groupId>org.springframework</groupId>
                                            <artifactId>spring-webmvc</artifactId>
                                        </dependency>
                                       </dependencies>
                                        <build>
                                            <finalName>springBOM</finalName>
                                            <plugins>
                                          <plugin>
                                            <groupId>org.apache.maven.plugins</groupId>
                                            <artifactId>maven-compiler-plugin</artifactId>
                                            <version>3.5.1</version>
                                            <configuration>
                                              <source>1.7</source>
                                              <target>1.7</target>
                                            </configuration>
                                          </plugin>
                                        </plugins>
                                        </build>
                                      </project>
    
  4. 建议选择 Spring-3.2.10.RELEASE 版本作为标准版本,发布时间比您问题中提到的版本最新。它仅适用于这个特定上下文。否则,我建议您将 JAR 文件升级到 Spring 4.X 版本。

【讨论】:

    【解决方案4】:

    为了检查你的战争是否用合适的 jar 包(aspectrj - 真正包含这个类 -org.aspect.lang.annotation.Aspect)。

    尝试(在 Eclipse 中)手动添加此依赖项。

    右键单击项目 -> 部署程序集 -> 添加 -> 从文件系统存档 -> 选择 aspectjrt-1.7.1.jar(您可以在本地 .m2 存储库中找到它)。 申请 运行新的战争-> 现在战争应该包括这个依赖。如果错误消息消失 -> 表明战争打包目标出了问题。

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多