AspectJ в проекте Maven, не работает / ткачество

1

Я пытаюсь получить ткачество AspectJ, работающее в простом проекте Maven, и не уверен, где это происходит: когда я запускаю код с помощью "mvn exec: java", я не вижу ожидаемого результата.

Я уверен, что код работает, потому что я пробовал то же самое в STS, где он работает нормально. Я просто хотел получить AspectJ, работающий в проекте Maven.

Любые намеки на то, как отлаживать такие проблемы, будут высоко оценены.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.aop</groupId>
<artifactId>aop1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>aop1</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</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.7.3</version> <!-- specify your version -->
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <source>1.7</source>
                            <target>1.7</target>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <outxml>true</outxml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1</version>
                <configuration>
                    <mainClass>com.aop.aop1.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Файл формата в той же папке, что и код:

    package com.aop.aop1;


public aspect aspect {

    pointcut secureAccess()
        : execution(* *.foo(..));

    before() : secureAccess() {
        System.out.println("BEHOLD the power of AOP !!!");
    }
}

Файл Java:

package com.aop.aop1;
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        foo();
    }
    public static void foo() {
        System.out.println(" IN FOO.");
    }
}
Теги:
maven
aspectj
aspectj-maven-plugin

1 ответ

10
Лучший ответ

Есть несколько проблем с вашей конфигурацией:

  • Аспект должен быть назван Aspect с капиталом "A" вместо aspect который является зарезервированным ключевым словом.
  • В POM отсутствует закрывающий </project>.
  • POM имеет раздел <pluginManagement>, но не отдельный раздел <plugins>, то есть вы предоставляете значения по умолчанию для своих плагинов, но фактически не заявляете, что хотите их использовать. Таким образом, либо вы используете автономный раздел <plugins> без <pluginManagement> либо вы обновляете плагины в дополнительном разделе <plugins>.
  • aspectj-maven-plugin нуждается в <version>. Вы забыли указать его.
  • Платформа aspectj-maven-plugin также нуждается в конфигурации <complianceLevel>.
  • Вы используете компиляцию во времени, поэтому вам не нужен параметр <outxml>. Это необходимо только для ткачества с загрузкой.
  • Для зависимости от аспектной зависимости требуется, по крайней мере, версия 1.7.4 для совместимости с версией, используемой в aspectj-maven-plugin 1.6 по умолчанию, чтобы скомпилировать ваши источники.

В дополнение к этому, я рекомендую использовать более новые версии плагинов Maven и зависимостей, таких как JUnit и exec-maven-plugin, если у вас нет веских причин использовать более старые. Я также рекомендую использовать последнюю версию AspectJ версии 1.8.2, а также указать, что ее можно использовать внутри аспект j-maven-plugin.

Рабочий файл pom.xml с минимальными изменениями:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.aop</groupId>
    <artifactId>aop1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>aop1</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </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.7.4</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.6</version>
                <configuration>
                    <complianceLevel>1.7</complianceLevel>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <source>1.7</source>
                            <target>1.7</target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1</version>
                <configuration>
                    <mainClass>com.aop.aop1.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Рабочий файл pom.xml с рекомендуемыми изменениями:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.aop</groupId>
    <artifactId>aop1</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>AOP Sample</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <aspectj.version>1.8.2</aspectj.version>
        <java.source-target.version>1.7</java.source-target.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.source-target.version}</source>
                    <target>${java.source-target.version}</target>
                    <!-- IMPORTANT -->
                    <useIncrementalCompilation>false</useIncrementalCompilation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.6</version>
                <configuration>
                    <showWeaveInfo>true</showWeaveInfo>
                    <source>${java.source-target.version}</source>
                    <target>${java.source-target.version}</target>
                    <Xlint>ignore</Xlint>
                    <complianceLevel>${java.source-target.version}</complianceLevel>
                    <encoding>UTF-8</encoding>
                    <verbose>true</verbose>
                </configuration>
                <executions>
                    <execution>
                        <!-- IMPORTANT -->
                        <phase>process-sources</phase>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjtools</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.3</version>
                <configuration>
                    <mainClass>com.aop.aop1.App</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.dstovall</groupId>
                <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <configuration>
                            <onejarVersion>0.96</onejarVersion>
                            <mainClass>com.aop.aop1.App</mainClass>
                            <attachToBuild>true</attachToBuild>
                        </configuration>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <pluginRepositories>
        <pluginRepository>
            <id>OneJAR googlecode.com</id>
            <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
            <!--<scope>runtime</scope>-->
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

BTW, onejar-maven-plugin - это просто лакомство, которое мне нравится использовать для создания автономного uber JAR (aka fat JAR), содержащего все необходимое для запуска программного обеспечения, то есть ваши классы/аспекты плюс время выполнения AspectJ, Вы можете просто запустить программу с помощью

java -jar aop1-0.0.1-SNAPSHOT.one-jar.jar

Результат должен быть похож на mvn exec:java только без материала Maven:

Hello World!
BEHOLD the power of AOP !!!
IN FOO.
  • 0
    Огромное спасибо. Отсутствие некоторых закрывающих скобок было связано с тем, что КАК-то подрезал мою пасту. Я сделал здесь ^ A ^ C ^ V. :) Эс хэт сэр геолфен. Данке Шон. :)
  • 0
    Большое спасибо - фантастический ответ
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню