2013-04-03 3 views
6

Ich versuche einige Aspekte zur Kompilierzeit in ein Projekt zu verweben, das zu einem WAR wird. Die Aspekte beraten Klassen, die sich innerhalb desselben Projekts befinden (jedoch in verschiedenen Paketen).AspectJ & Maven Warnung: "Hinweis in ... definiert wurde nicht angewendet?"

erhalte ich die Warnung:

Advice not applied 

Mein Aspekt nicht ausgeführt wird. Hier ist mein Setup:

Anmerkung FooAnnotation.java:

package a; 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface FooAnnotation {} 

Aspekt FooAdvice.aj:

package a; 
public aspect FooAdvice { 
    private static final Log log = LogFactory.getLog(FooAdvice.class); 

    Object around() : call(@FooAnnotation * *(..)) { 
     log.info(String.format("Testing around")); 
     return proceed(); 
    } 
} 

Ich habe auch versucht die Anmerkung:

@Around("call(@FooAnnotation * *(..))") 
public Object checkFoo(ProceedingJoinPoint joinPoint) throws Throwable { 

Soweit ich kann sagen Sie, meine Pointcut-Spezifikation ist korrekt, aber aus irgendeinem Grund spielt der AJC-Compiler nicht Ball.

Klasse FooClass.java:

package b; 
@ApplicationPath("/service") 
@Path("/{param}") 
@Produces("application/json") 
@Provider 
public class FooClass { 

    @POST 
    @PUT 
    @Path("/{context}/{resource}") 
    @FooAnnotation 
    public String updateResource(...) {} 

pom.xml:

<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>zzz.group</groupId> 
    <artifactId>yyy.artifact</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>yyy.name</name> 

    <properties> 
     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <javaVersion>1.6</javaVersion> 
     <org.aspectj-version>1.7.2</org.aspectj-version> 
    </properties> 

    <dependencies> 
     <dependency> 
      ... stuff ... 
     </dependency> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>${org.aspectj-version}</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.0</version> 
       <configuration> 
        <source>${javaVersion}</source> 
        <target>${javaVersion}</target> 
        <compilerArguments> 
         <endorseddirs>${endorsed.dir}</endorseddirs> 
        </compilerArguments> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>aspectj-maven-plugin</artifactId> 
       <!-- 
        Have to use version 1.2 since version 1.3 does not appear to work 
        with ITDs 
       --> 
       <version>1.4</version> 
       <dependencies> 
        <!-- 
         You must use Maven 2.0.9 or above or these are ignored (see 
         MNG-2972) 
        --> 
        <dependency> 
         <groupId>org.aspectj</groupId> 
         <artifactId>aspectjrt</artifactId> 
         <version>${org.aspectj-version}</version> 
        </dependency> 
        <dependency> 
         <groupId>org.aspectj</groupId> 
         <artifactId>aspectjtools</artifactId> 
         <version>${org.aspectj-version}</version> 
        </dependency> 
       </dependencies> 
       <executions> 
        <execution> 
         <goals> 
          <goal>compile</goal> 
          <!-- <goal>test-compile</goal> --> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <outxml>true</outxml> 
        <source>${javaVersion}</source> 
        <target>${javaVersion}</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Antwort

4

Aha! Konnten Sie die Antwort hier:

aspectj: why advice cannot be applied?

Es hat nichts mit Maven zu tun hat.

Der Grund ist, dass in meinem Beispiel die Methode aus dem jax-rs-Framework durch indirektes Laden aufgerufen wird. Die call() Empfehlung möchte den Aufrufer weben, aber der AJC-Compiler kann nicht wissen, wo der Aufrufer ist. Die Lösung ist die Beratung zu execution() thusly zu ändern:

Object around() : execution(@FooAnnotation * *(..)) {...} 

Dies unterscheidet, weil es um die Ausführung webt (die ajc finden), anstatt den Anrufer.

Fertig.

+0

Leider habe ich festgestellt, dass die Verwendung der Anweisung 'execute()' die Methode so stark verändert, dass der jax-rs reflecting Loader VerifyError-Meldungen während des Ladens auslöst, daher ist AOP keine gute Wahl für jax-rs Internetdienste. – PaulProgrammer

Verwandte Themen