web-dev-qa-db-ja.com

Spring + AspectJウィービングJava 8を使用してaspectj-maven-pluginを使用

プロジェクトをJava 7からJava 8に移行しています。問題は、aspectj-maven-pluginを使用したアスペクトの織り方に関連しています。

Haus documentation に従って、Java 6および7で実行されるこのプラグインを使用してウィービングを正常に構成できました。しかし、問題は、Java 8をサポートするプラグインバージョン7を使用(および検索)する方法が見つからないことです。 here そのプラグイン7はJava 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のウィーバーを実行する方法を知っていますか?

17
Federico Piazza

2015年9月より前の公式リリース前の解決策

多くの頭痛とこれに苦労する多くの時間の後、幸いなことに私はこの問題を解決できました。これが私がしたことです:

aspectj-maven-pluginをJava 8で使用するには、バージョンaspectj-maven-plugin 1.7を設定できます(aspectj-maven-plugin 1.6はJava 7)。

そのため、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 jarは次のとおりです。

<!-- 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>

私が苦労した最も重要なことは、これらのjar/pomファイルがまだMavenリポジトリにないため、アスペクトj-maven-plugin 1.7 jarを手動でインストールする必要があることでした。

更新:したがって、jarファイルは Haus Jira リンクからダウンロードできます(添付セクションをご覧ください)。 Hausが利用できなくなった場合は、githubからダウンロードできます。

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

ダウンロードしてローカルリポジトリにコピーした後、ディレクトリ内にownaspectj-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>

私のJava私が使用するアスペクト:

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



2015年9月以降にリリースされた最終的な公式プラグイン

これは、公式プラグインリリースに関する回答の更新です。 AspectJでJava 8を使用するには、公式のaspectj mavenプラグインが次のリンクにあります。

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>
33
Federico Piazza