Использование аспектов из других банок - PullRequest
6 голосов
/ 20 мая 2011

Я пытаюсь выполнить следующее:

У меня есть сервер со следующей структурой.

bin
   apis
   services
   etc...

Я хочу определить API, который содержит аспект, который должен бытьиспользуется службами.Скажем:

@Aspect
public class AuthorizationAspect {
    @Pointcut("call(* *()) && @annotation(Authorization)")
    public void cutAuthorize() { }

    @Before("cutAuthorize()")
    public void callFromAuthorizeBefore() {
        System.out.println("Test");
    }
}

Затем я определяю службу и аннотирую нужные методы с помощью @Authorization, и в этом аспекте она получает точечные обозначения.

Вещи, которые вы должны знать:

  • Сервисы используют API только для компиляции кода, поэтому область действия «предоставляется», поскольку API будет уже на сервере.
  • Сервисные JAR-файлы загружаются динамически, поэтому они находятся в другом загрузчике классов.

Мой вопрос: как я могу это сделать?Как мне определить мои maven артефакты для достижения этой цели?

Я заметил, что плагин aspectj имеет раздел weaveDependencies, но он также будет включать в JAR службы все классы в этом API (то, чего я хочу избежать),Это правильный ход?

Заранее спасибо,

Руи

1 Ответ

3 голосов
/ 01 января 2013

Посмотрите, как это делается в аспектах jcabi .Вы объявляете / компилируете свои аспекты в API, а затем используете этот JAR, поскольку мы com.jcabi:jcabi-aspects используем в примере:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>aspectj-maven-plugin</artifactId>
  <configuration>
    <aspectLibraries>
      <aspectLibrary>
        <groupId>com.jcabi</groupId>
        <artifactId>jcabi-aspects</artifactId>
      </aspectLibrary>
    </aspectLibraries>
  </configuration>
</plugin>

Это нормально, чтобы JAR ваших аспектов был в provided (или runtime) область применения.

...