2013-04-03 30 views
6

Derleme zamanında bazı özellikleri bir WAR haline gelen bir projeye dönüştürmeye çalışıyorum. Yönler aynı proje içindeki sınıfları önerir (farklı paketlerde olsa da).AspectJ & Maven uyarısı: "Öneriler ... uygulanmamış mı?"

Advice not applied 

My boy değil yürütülmekte olan:

ben uyarı olsun. İşte benim Kurulum:

açıklama FooAnnotation.java:

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

yönü FooAdvice.aj: Bildiğim kadarıyla olabildiğince

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

: Ben de ek açıklama çalıştı

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(); 
    } 
} 

söyle, benim pointcut spesifikasyonum doğru, fakat bir sebepten dolayı ajc derleyicisi top oynamıyor.

Sınıf 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> 

cevap

4

Aha! Cevap burada Bulunan:

aspectj: why advice cannot be applied?

O maven ile ilgisi yoktur. Nedeni, benim örneğimde, dolaylı yükleme ile jax-rs çerçevesinin içinden deneniyor olmasıdır. call() tavsiyesi arayanı örgülemeyi istemektedir, ancak ajc derleyici arayanın nerede olduğunu bilemez. düzeltme thusly execution() tavsiyelerde değiştirmektir:

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

oldukça arayana daha (ajc bulabilirsiniz) yürütme etrafında örgüleri Bunun nedeni farklıdır.

Bitti.

+0

Ne yazık ki, 'execute() 'öğesinin kullanılmasının, yöntemin jax-rs yansıtma yükleyicinin yükleme sırasında VerifyError mesajlarını attığı noktaya yönlendirilmesinin nedenini keşfettim, bu yüzden AOP, jax-rs için iyi bir seçim değildir Ağ hizmetleri. – PaulProgrammer