복붙노트

[SPRING] Java 8에서 Spring AOP가 IllegalArgumentException을 발생시킵니다.

SPRING

Java 8에서 Spring AOP가 IllegalArgumentException을 발생시킵니다.

Java 8 및 Spring AOP 4.0.6에서 다음 오류가 발생합니다.

    java.lang.RuntimeException: Error scanning file MonitorAroundPerformance.class
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:705)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parse(AnnotationParser.java:821)
    at org.eclipse.jetty.annotations.AnnotationConfiguration$ParserTask.call(AnnotationConfiguration.java:159)
    at org.eclipse.jetty.annotations.AnnotationConfiguration$1.run(AnnotationConfiguration.java:531)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
    at java.lang.Thread.run(Thread.java:745)
Caused by: 
java.lang.IllegalArgumentException
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at org.eclipse.jetty.annotations.AnnotationParser.scanClass(AnnotationParser.java:970)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:700)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parseDir(AnnotationParser.java:686)
    at org.eclipse.jetty.annotations.AnnotationParser.parse(AnnotationParser.java:821)
    at org.eclipse.jetty.annotations.AnnotationConfiguration$ParserTask.call(AnnotationConfiguration.java:159)
    at org.eclipse.jetty.annotations.AnnotationConfiguration$1.run(AnnotationConfiguration.java:531)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
    at java.lang.Thread.run(Thread.java:745)

그러나 자바 소스 및 대상을 1.7로 변경하면이 오류가 사라집니다. POM.xml 설정 -

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.0.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Eclipse에서 빌드 경로의 항아리 Kepler - spring-aop-4.0.6, aspectjrt-1.8.2.jar, aopalliance-1.0.jar, jetty-maven-plugin : 9.1.1.v20140108

구성 :

<bean id="performanceAdvice"
    class="com.util.MonitorAroundPerformance" />

<bean id="performanceAdvisor"
    class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
    depends-on="propertyOverrideConfigurer">
    <property name="advice" ref="performanceAdvice" />
</bean>


<bean
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
    <property name="proxyTargetClass" value="true" />
</bean>

해결법

  1. ==============================

    1.Jetty 9.2.0은 JDK8에 대한 주석 및 클래스 스캐닝을 지원하는 Jetty의 첫 번째 버전입니다.

    Jetty 9.2.0은 JDK8에 대한 주석 및 클래스 스캐닝을 지원하는 Jetty의 첫 번째 버전입니다.

    우리가 사용하는 asm 라이브러리에 대한 업데이트가 있었고, 새로운 JDK8 바이트 코드 스캐닝을 지원하는 몇 가지 API 변경 사항이있었습니다.

    업그레이드를 원할 것입니다.

  2. ==============================

    2.asm 5. *로 업그레이드하면 작동하지 않으므로 모든 asm jar 파일도 jetty에서 제외하십시오. 이 구성은 저에게 효과적이었습니다.

    asm 5. *로 업그레이드하면 작동하지 않으므로 모든 asm jar 파일도 jetty에서 제외하십시오. 이 구성은 저에게 효과적이었습니다.

            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.6.v20170531</version>
                <configuration>
                    <webApp>
                        <webInfIncludeJarPattern>.*/^(asm-all-repackaged)[^/]*\.jar$</webInfIncludeJarPattern>
                    </webApp>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.ow2.asm</groupId>
                        <artifactId>asm</artifactId>
                        <version>5.2</version>
                    </dependency>
                    <dependency>
                        <groupId>org.ow2.asm</groupId>
                        <artifactId>asm-commons</artifactId>
                        <version>5.2</version>
                    </dependency>
                </dependencies>
            </plugin>
    
  3. ==============================

    3.나는 GWT 2.8 웹 프로젝트 (이클립스 플러그인, JAVA 8)와 비슷한 문제가 있었다.

    나는 GWT 2.8 웹 프로젝트 (이클립스 플러그인, JAVA 8)와 비슷한 문제가 있었다.

    내 간단한 해결책은 새로운 Eclipse 작업 공간에서 GWT 웹 프로젝트를 작성하는 것이었다.

  4. from https://stackoverflow.com/questions/26305416/spring-aop-gives-illegalargumentexception-with-java-8 by cc-by-sa and MIT license