Может ли плагин maven aspectj сплетать аспекты, написанные с помощью аннотаций?

У меня есть проект, в котором я хочу использовать аспекты, но не использовать весну. Поэтому я использую AspectJ. В моем конкретном случае LTW не будет работать для меня, поэтому я должен использовать CTW, что приводит меня к плагину maven aspectj. В настоящее время я использую Java 7. Я вплетаю аспект, написанный в одном модуле maven, в другой модуль, который имеет его в качестве зависимости.

Кажется, что плагин корректно переплетается, когда я создаю неаннотированный аспект, но когда я переключаю его на аспект, основанный на аннотациях, кажется, что плагин не пишет в методах hasaspect() и aspectof(), потому что во время выполнения Я получаю исключения, говорящие, что методы не существуют.

Одна вещь, которую я попробовал, состояла в том, чтобы аспект, основанный на аннотациях, расширял класс Aspect, в надежде, что тогда он сможет найти методы, но это также не сработало.

мой плагин настроен так:

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

То, что я должен был сделать, - это вернуться к старому стилю без аннотированных аспектов. Но это перетаскивание, так как я не могу затем генерировать исключения из метода (или, по крайней мере, пока, я не знаю, как). Создание исключений будет особенно полезно для таких вещей, как безопасность, где, если у пользователя нет доступа, исключение будет подходящим способом оповещения вызывающей стороны.

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

1 ответ

У меня работает почти та же самая настройка (я перешел из Spring, и Google App Engine поддерживает только создание компиляции во время компиляции) и развертывание многомодульного EAR.

Судя по вашему вопросу, вы не нашли документацию по AspectJ Multi-Module и не использовали ее в своих настройках. При более внимательном рассмотрении вашего POM я вижу, что в разделе "Выполнения" у вас ничего нет для фазы тест-компиляции. Кроме того, вы должны получать как можно больше информации: установите для verbose и showWeaveInfo значение true. Это должно дать вам лучшую ошибку в Google (и, вероятно, получить указание обратно на Stackru) или обратиться за помощью.

Мой раздел казни выглядит следующим образом

      <!-- 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>

Между получением дополнительной информации, тест-компиляцией и настройкой проекта в соответствии с рекомендациями вы сможете приступить к работе.

Другие вопросы по тегам