Какой плагин Maven я использую для AspectJ? - PullRequest
19 голосов
/ 06 сентября 2010

Я пытаюсь добавить aspectj в проект maven, используя Java 6.0. Просматривая вокруг, я нашел 2 плагина maven, ни один из которых не работает так, как я ожидал.

Первый http://mojo.codehaus.org/aspectj-maven-plugin сначала не работал через netbeans, потому что я не мог получить код для компиляции исходного кода версии 5.0 или новее (он жаловался на аннотации и т. Д.) После попытки из командной строки, которая работала, и сравнения Выполненные команды, кажется, что его цель установки mavens несовместима с плагином и кодом Java 5+, в то время как цель компиляции работает нормально. Хотя можно обойти это, это раздражает и подводит меня к вопросу: разрабатывается ли аспектj-maven-plugin? Должен ли я все еще использовать это?

Второй - собственный апач, который кажется более активным и с большей вероятностью работает. Однако я не могу найти полных примеров и не могу его запустить. Я продолжаю получать исключение от Maven:

java.lang.IllegalStateException: The plugin descriptor for the plugin Plugin [maven:maven-aspectj-plugin] was not found. Please verify that the plugin JAR /home/kristofer/.m2/repository/maven/maven-aspectj-plugin/4.0/maven-aspectj-plugin-4.0.jar is intact.

Файл jar есть, он не поврежден, и не имеет значения, какую версию плагина я использую, он всегда выдает одно и то же исключение. Есть идеи, в чем может быть проблема?

Короче говоря, какой плагин и как мне его использовать?

Спасибо

Ответы [ 3 ]

17 голосов
/ 07 сентября 2010

Вот настройка, которая работает для меня (с использованием недокументированного aspectj-maven-plugin ).

Структура проекта выглядит следующим образом:

$ tree .
.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── stackoverflow
    │               └── Q3651690
    │                   ├── App.java
    │                   └── DontWriteToTheConsole.aj
    └── test
        └── java
            └── com
                └── stackoverflow
                    └── Q3651690
                        └── AppTest.java

Со следующим небольшим демонстрационным аспектом:

public aspect DontWriteToTheConsole {

    pointcut sysOutOrErrAccess() : get(* System.out) || get(* System.err);

    declare error
      : sysOutOrErrAccess()
      : "Don't write to the console";

}

И файл pom.xml настроен так:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.stackoverflow.Q3651690</groupId>
  <artifactId>Q3651690</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>Q3651690</name>
  <properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.7</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.3</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal><!-- to weave all your main classes -->
              <goal>test-compile</goal><!-- to weave all your test classes -->
            </goals>
          </execution>
        </executions>
        <configuration>
          <source>${maven.compiler.source}</source>
          <target>${maven.compiler.target}</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Ключевые части:

  • чтобы настроить плагин maven-compiler-plugin для исходного уровня 1.6 (это делается с помощью properties)
  • чтобы настроить аспектj-maven-плагин для уровня источника 1.6 (и здесь я снова использовал properties, использованный для настройки плагина maven-compiler-plugin)

Второй шаг кажется излишним, но, ну, вот как дела.

Таким образом, я смог соткать код с помощью аннотаций и т. Д .:

$ mvn clean install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Q3651690
[INFO]    task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/pascal/Projects/stackoverflow/Q3651690/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to /home/pascal/Projects/stackoverflow/Q3651690/target/classes
[INFO] [aspectj:compile {execution: default}]
[ERROR] Don't write to the console
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Compiler errors:
error at System.out.println( "Hello World!" );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/App.java:11:0::0 Don't write to the console
    see also: /home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/DontWriteToTheConsole.aj:8::0
...
3 голосов
/ 06 сентября 2010

Вы можете использовать плагин Maven Compiler и изменить компилятор для использования AspectJ.

Конфигурация выглядит следующим образом:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
        <compilerId>aspectj</compilerId>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-compiler-aspectj</artifactId>
            <version>1.6</version>
        </dependency>
    </dependencies>
</plugin>

Ресурсы:

По той же теме:

2 голосов
/ 12 сентября 2010

мы используем aspectj-maven-plugin для создания нескольких крупных систем J2EE промышленного уровня.В последнее время разработка этого плагина не кажется слишком активной.Последнее обращение было прошлой зимой, и есть некоторые серьезные проблемы с «AspectLib» и «WeaveDependencies», о которых сообщалось несколько раз (даже с прикрепленными исправлениями), без каких-либо ответов от апстрима.

Но все равно,базовая функциональность работает, и этот плагин поддерживает множество конфигураций, необходимых в реальных проектах.

Паскаль Thivent показал в своем (очень хорошем) ответе выше, как настроить плагин со специальным разделом зависимостей.Этот прием также можно использовать для настройки фактической версии AspectJ, используемой для компиляции , поскольку версия, используемая по умолчанию этим плагином, несколько устарела ....

<project xmlns=....

<properties>
    <aspectjVer>1.6.9</aspectjVer>
    ....
    ....
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
....

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.3</version>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>${aspectjVer}</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${aspectjVer}</version>
                </dependency>
            </dependencies>
            <configuration>
       ....
</build>
<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${aspectjVer}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId><!-- only needed if you use Spring-AOP -->
        <version>${aspectjVer}</version>
    </dependency>
    ....
    ....

Обратите внимание на тот факт, , что плагин имеет среду пути к классам, которая не зависит от пути к классам вашего проекта.Таким образом, мы должны явно добавить AspectJ-Runtime к зависимостям проекта.

...