3

我试图让 AspectJ 在现有项目中工作(实际上我对那个项目了解不多,因为它似乎不重要)。

我们决定使用加载时间编织来避免使用ajc

因为我是 AspectJ 的新手,所以我首先创建了一个带有一些类和日志方面的示例项目:

@Aspect
public class LoggingAspect {

    @Pointcut("call(public de.test.beans.IPerson+.*(..))")
    public void logExecutions(JoinPoint jp) {}

    @Before("logExecutions(jp)")
    public void beforeExecutions(JoinPoint jp) {
        BeforeExecutionLog log = new BeforeExecutionLog(jp);
        System.out.println(log);                
    }

    @AfterReturning(pointcut = "logExecutions(jp)", returning = "ret")
    public void afterExecutions(JoinPoint jp, Object ret) {
        AfterExecutionLog log = new AfterExecutionLog(jp, ret);        
        System.out.println(log);        
    }    

}

它工作正常,一切都很好。

作为下一步,我尝试将 AspectJ 和 Maven 一起使用。我只是稍微改变了日志方面(只是包)。

根据“AspectJ in Action”一书中的代码,我修改了我们的 maven pom.xml

       <dependencies>
            ...
        <dependency>
           <groupId>org.aspectj</groupId>
           <artifactId>aspectjrt</artifactId>
           <version>1.6</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.12.M1</version>
        </dependency>       
       </dependencies>
        <plugin>                                                 
            <groupId>org.codehaus.mojo</groupId>            
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>                                         
                <execution>                                      
                    <goals>                                      
                        <goal>compile</goal>                     
                    </goals>                                     
                    <configuration>                              
                        <source>1.5</source>                     
                        <target>1.5</target>                     
                    </configuration>                             
                </execution>                                     
            </executions>                                        
        </plugin>   

但是如果尝试调用mvn clean install我会得到数千个错误,第一个是:

[ERROR] Syntax error on token "call(public xxx.yyy.zzz.api.Service+.*(..))", "name pattern" expected
[ERROR] Method annotated with @Pointcut() for abstract pointcut must be abstract

还有以下错误:

[ERROR] The method xyz() of type zyx must override a superclass method

我想这些都是受我方面影响的方法。

谁能解释我,怎么了?

先感谢您

升级版:

我更新了我的问题。

4

3 回答 3

2

也许它对某人有用。

[ERROR] The method xyz() of type zyx must override a superclass method

出现此错误,然后您尝试使用 javac ver1.5 编译代码,并对刚刚在 java 类中实现的方法进行 @Override 注释。

public interface A { void someMethod(); }
public class B implements A {
  @Override
  public void someMethod() {
    doSomething();
  }
}

我用这个

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

在这里详细查找

于 2013-02-01T07:38:07.710 回答
2

您的示例似乎不完整,并且您显示的错误与代码不匹配,但我没有看到使用以下 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>org.test</groupId>
    <artifactId>test2</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.11</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <source>1.5</source>
                            <target>1.5</target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
于 2012-05-09T17:35:31.753 回答
0

名称模式中存在错误:缺少返回类型。尝试任何类型的 asterix:

@Pointcut("call(public * de.test.beans.IPerson+.*(..))")
于 2015-07-20T12:33:48.287 回答