복붙노트

[SPRING] Spring + AspectJ는 aspectj-maven-plugin을 사용하여 자바 8을 위빙한다.

SPRING

Spring + AspectJ는 aspectj-maven-plugin을 사용하여 자바 8을 위빙한다.

내 프로젝트를 Java 7에서 Java 8로 마이그레이션하고 있는데 aspectj-maven-plugin을 사용하여 aspectj와 관련된 문제가 발생했습니다.

Haus 설명서에 따라 Java 6 및 7에서 실행되는이 플러그인을 사용하여 위빙을 성공적으로 구성 할 수있었습니다. 그러나 문제는 내가 자바 8을 지원하는 플러그인 버전 7을 사용하는 방법을 찾지 못했다는 것이다. 플러그인 7이 자바 8 지원을 추가했지만 사용 방법을 찾을 수 없다는 것을 알았다.

필요한 구성 플러그인은 다음과 같습니다.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.7</version> <!-- AspectJ weaver plugin 7 is for java 8 (version 1.6 is for java 7) -->
          <configuration>
              <complianceLevel>1.8</complianceLevel>
              <source>1.8</source>
              <target>1.8</target>
          </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

위에서 버전 1.6을 사용하는 코드가 Java 7에서 제대로 작동하지만 1.7 버전을 사용하려는 행운이 없다는 것을 확인했습니다.

Java + 8에서 실행되는 spring + aspectj에 대한 위버를 실행하는 방법을 알고 있습니까?

해결법

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

    1.다행스럽게도 나는이 문제를 해결할 수 있었다. 여기 내가 한 일이있다.

    다행스럽게도 나는이 문제를 해결할 수 있었다. 여기 내가 한 일이있다.

    Java 8에서 aspectj-maven-plugin을 사용하려면 aspectj-maven-plugin 버전을 구성 할 수 있습니다 (Java 7에서는 aspectj-maven-plugin 1.6이 작동 함).

    따라서, Maven 플러그인 설정은 다음과 같아야합니다.

    <!-- AspectJ configuration -->
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.7-SNAPSHOT</version>
        <configuration>
            <complianceLevel>1.8</complianceLevel>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>compile</goal>
                    <goal>test-compile</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    그건 그렇고, 필요한 aspectj 항아리가 있습니다 :

    <!-- Spring AOP + AspectJ -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.0.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.1</version>
    </dependency>
    

    내가 고민했던 가장 중요한 것은 aspectj-maven-plugin 1.7 jar를 설치하는 것이었다. jar / pom 파일이 아직 메이븐 레포에 없기 때문에 수동으로해야했다.

    업데이트 : Jar 파일은 Haus Jira 링크에서 다운로드 할 수 있습니다 (첨부 파일 섹션 참조). Haus를 더 이상 사용할 수 없다면 github에서 다운로드 할 수 있습니다.

    https://github.com/fedepia/aspectj-maven-plugin-1.7

    다운로드하고 내 로컬 저장소에 복사 한 후 디렉토리 내에 내 aspectj-maven-plugin-1.7-SNAPSHOT.pom 파일을 만들어야했습니다.

    .m2\repository\org\codehaus\mojo\aspectj-maven-plugin\1.7-SNAPSHOT\aspectj-maven-plugin-1.7-SNAPSHOT.pom
    

    버전 1.6의 사본을 기반으로했지만 다음 내용을 수정해야했습니다.

    <version>1.7-SNAPSHOT</version>
    
    <properties>
        <aspectjVersion>1.8.1</aspectjVersion>
        <mavenVersion>2.2.1</mavenVersion>
        <changesPluginVersion>2.9</changesPluginVersion>
    </properties>
    

    그게 전부 네가 간다, 도와주기를 바란다.

    업데이트 : (Xtreme Biker가 의견에 물었을 때 자세한 내용을 추가)

    내 컨텍스트 구성에서 나는 가지고있다 :

    <aop:aspectj-autoproxy /> 
    
    <bean id="notificationAspect" class="com.integration.core.aspect.NotificationAspect" factory-method="aspectOf" scope="singleton"></bean>
    

    내 자바 측면 들어 :

    @Aspect
    public class NotificationAspect
    {
       ...
       @AfterThrowing(pointcut="@annotation(com.integration.core.meta.NotifyOnFailure)", throwing="ex")
       public void executeOnException(JoinPoint joinPoint, ExternalApiExecutionException ex) throws Throwable
        {
        ...
    

    이것은 공식 플러그인 릴리스에 대한 답변입니다. AspectJ와 함께 Java 8을 사용하기 위해, 공식 aspectj maven plugin은이 링크에서 찾을 수 있습니다 :

    http://www.mojohaus.org/aspectj-maven-plugin/usage.html

    다음은 Maven 저장소에 대한 링크입니다.

    http://mvnrepository.com/artifact/org.codehaus.mojo/aspectj-maven-plugin/1.8

    설명서에 사용 된 코드는 다음과 같습니다.

    <project>
      ...
      <dependencies>
        ...
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjrt</artifactId>
          <version>1.8.7</version>
        </dependency>
        ...
      </dependencies>
      ...
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <executions>
              <execution>
                <goals>
                  <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
                  <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
                </goals>
              </execution>
            </executions>
          </plugin>
          ...
        </plugins>
      <build>
      ...
    </project>
    
  2. from https://stackoverflow.com/questions/25209339/spring-aspectj-weaving-for-java-8-using-aspectj-maven-plugin by cc-by-sa and MIT license