Подтвердить что ты не робот

Какой плагин maven я использую для AspectJ?

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

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

Второй - это апачи, которые кажутся более активными и с большей вероятностью работают. Однако я не могу найти никаких полных примеров, и я не могу запустить его. Я получаю исключение из 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 существует, неповрежденный, и также не имеет значения, какую версию плагина я использую, он всегда вызывает одно и то же исключение. Любые идеи о том, что может быть проблемой?

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

Спасибо

4b9b3361

Ответ 1

Вот настройка, которая работает для меня (используя под документированным 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)
  • настроить плагин aspectj-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
...

Ответ 2

Вы можете использовать плагин 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>

Ресурсы:

В той же теме:

Ответ 3

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

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

Pascal 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>
    ....
    ....

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