2013-06-15 2 views
0

나는 aspect를 사용하고 싶지만 봄을 사용하지 않는 프로젝트가있다. 그래서 AspectJ를 사용하고 있습니다. 필자의 특정 시나리오에서는 LTW가 작동하지 않으므로 CTW를 사용해야합니다. 그러면 CTW가 사용되어 maven aspectj 플러그인으로 연결됩니다. 현재 Java 7을 사용하고 있습니다. 한 Maven 모듈로 작성된 aspect를 의존성을 갖는 다른 모듈로 짜 맞추고 있습니다.maven aspectj plugin은 주석을 통해 작성된 aspect를 짜낼 수 있습니까?

플러그인이 주석이 달린 애스펙트를 만들 때 올바르게 짜여진 것처럼 보이지만 주석 기반 애스펙트로 전환하면 플러그인이 hasaspect() 및 aspectof()에 쓰지 않는 것처럼 보입니다. 왜냐하면 런타임에 메소드가 존재하지 않는다는 예외가 생기기 때문입니다.

필자가 시도한 한 가지 방법은 애스펙트 기반의 애스펙트를 확장하여 애스펙트 클래스를 확장하는 것이 었습니다. 그런 다음 메소드를 찾을 수 있기를 희망했지만 작동하지 않았습니다. 같은 구성에

내 플러그 :

<plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.4</version> 
      <configuration> 
       <showWeaveInfo>false</showWeaveInfo> 
       <Xlint>ignore</Xlint> 
       <source>1.7</source> 
       <target>1.7</target> 
       <complianceLevel>1.7</complianceLevel> 
       <encoding>UTF-8</encoding> 
       <verbose>false</verbose> 
       <weaveDirectories> 
        <weaveDirectory>${project.build.outputDirectory}</weaveDirectory> 
       </weaveDirectories> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>my.group</groupId> 
         <artifactId>dependencywithaspecttoweave</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>1.7.2</version> 
       </dependency> 
      </dependencies> 

내 주석 측면은 다음과 같습니다

내가해야 할 일을했을 것 무엇
public class TraceLog extends Aspects { 
private ComponentLogger logger; 

@Pointcut(value = "within(my.package..*) && " 
     + "execution(* *(..))") 
public void scope() { 
} 

/** 
* Before method. 
* 
* @param thisJoinPoint The joinpoint. 
* @throws IllegalAccessException When it tries to get the logger and can't. 
*/ 
@Before(value = "scope()") 
public void logBefore(final JoinPoint thisJoinPoint) throws IllegalAccessException { 
    logMethod(thisJoinPoint, "Entering " + createLogMessage(thisJoinPoint)); 
} 
... 

는 평범한 구식이 아닌 주석으로 되돌릴이다 가로 세로 스타일. 그러나 이것은 메소드에서 예외를 던질 수 없기 때문에 (또는 최소한 아직까지는 어떻게 해야할지 모르겠다.) 드래그이다. 예외를 throw하는 것은 보안과 같은 경우 특히 유용합니다. 사용자가 액세스 권한이없는 경우 호출자에게 알리는 적절한 방법이 예외입니다.

미리 감사드립니다.

+0

동일한 플러그인을 사용하면서 일주일 전에 비슷한 문제가있었습니다. 귀하의 코드가 내 것과 동일한 지 여부는 모르지만 aspect와 함께 모듈과 권고 된 클래스가 포함 된 모듈 모두에서 플러그인을 사용해야했습니다. 플러그인은 ajc를 호출하여 필요한 메소드를 aspect에 추가합니다. 또한 ajc를 호출하여 주석이 달린 클래스 앞뒤에 조언을 표시합니다. 내가 제기 한 질문 (지금까지 답변이없는)은 다음과 같습니다. http://stackoverflow.com/questions/17075862/java-lang-verifyerror-incompatible-argument-to-function-aspectj. 저기 github 내 예제 코드에 대한 링크가 있습니다. –

+0

사실, 그렇습니다. 나는 aspect를 포함하는 모듈과 권고 된 클래스를 포함하는 모듈 모두에서 플러그인을 실행했다는 사실을 잊어 버렸습니다. 플러그인 구성은 물론 aspectlibraries 노드를 제외하고 동일합니다. – Eric

+0

덧붙여서, 나는 당신이 물어 본 질문에 선이 있다고 생각합니다. 거기서 내 대답을 확인하십시오. – Eric

답변

0

나는 거의 동일한 설정 작업을하고 있습니다. (스프링에서 옮겨 갔고 Google App Engine은 컴파일 시간 짜기 만 지원합니다), 다중 모듈 EAR을 배치했습니다.

질문에서 귀하가 AspectJ Multi-Module documentation을 찾지 못했고 귀하의 설정에서 사용하는 것 같습니다. POM을 더 자세히 살펴보면 실행 섹션에서 테스트 컴파일 단계를 수행 할 필요가 없다는 것을 알 수 있습니다. 또한 가능한 한 많은 정보를 얻고 있어야합니다 : verbose 및 showWeaveInfo를 true로 설정하십시오. 그러면 Google에 더 나은 오류를 줄 수 있으며 (또는 StackOverflow로 다시 안내 할 수도 있음) 도움을 요청하십시오. 자세한 내용은 테스트 컴파일을 얻고 당신이 추천 당신이 가야 할 수 있어야한다 프로젝트 설정 사이

 <!-- Executions for compiler --> 
     <executions> 
     <execution> 
      <id>aspectj-compile</id> 
      <goals> 
      <goal>compile</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>aspectj-test-compile</id> 
      <goals> 
      <goal>test-compile</goal> 
      </goals> 
     </execution> 
     </executions> 

을 다음과 같이

내 실행 섹션입니다.

관련 문제