【问题标题】:Maven doesn't weave aspectj codeMaven 不编织 aspectj 代码
【发布时间】:2014-07-07 16:43:02
【问题描述】:

我在使用 maven 在 Eclipse 中构建方面项目时遇到问题。当我通过 eclipse "Run As > Maven build" 运行 maven 时,我收到以下消息:<...>/Clazz.java:[5,32] 错误:找不到符号。所以,看起来 aspectj 并没有通过 maven 编织代码。

我提炼了这个问题,直到有一个类和一个在提到的类中定义了intertype属性的方面,如下所示:

public class Clazz {
    public static void main(String[] args) {
        System.out.println(new Clazz().string);
    }
}

public aspect Aspect {

    public String Clazz.string = "string";

}

pom.xml 如下所示:

  <dependencies>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.7.3</version>
</dependency>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

【问题讨论】:

标签: java maven maven-2 aspectj aspectj-maven-plugin


【解决方案1】:

问题似乎是maven-compiler-plugin 在您进行 AspectJ 编译时不知道要让路,并在ajc 有机会拉入 ITD 之前抛出导致构建终止的错误。我的解决方案是完全禁用maven-compiler-plugin,让ajc 处理编译.java 文件:

<!-- disable compiler because compiler chokes on ITDs -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
        <execution>
            <id>default-testCompile</id>
            <phase>none</phase>
        </execution>
        <execution>
            <id>default-compile</id>
            <phase>none</phase>
        </execution>
    </executions>
</plugin>

【讨论】:

  • 如果我这样做,构建工作。但是生成的 jar 没有任何类。
  • @Bruno 您是否还有 AspectJ compile 目标,您是否进行了全面清理和重新编译?
  • 不,我误解了您的答案,并用您的替换了 aspectj 插件定义。所以,现在构建正在运行。但是,当我使用生成的 jar 通过“java -jar”执行 jar 时,我得到了 ClassNotFoundException:org.aspectj.lang.NoAspectBoundException。因此,看起来编译后的代码与 aspectj lib 有依赖关系,这很奇怪,因为我的意图是在编译时编织方面代码。你对此有任何猜测吗?提前致谢。
  • @Bruno 我对 AspectJ 不够熟悉,无法分辨,但这表明它期待 AspectJ RT。这就是我使用 CTW(来自 Roo)的经验。
  • 我已经将“aspectjrt.jar”作为依赖项,以及“aspectjtools.jar”在以下命令中: java -cp ".\lib*" -jar perf-pocs-0.0.1 -SNAPSHOT.jar(两个 jar 都在 lib 文件夹内),问题仍然存在。还是谢谢。
【解决方案2】:

其实你不需要停用 Maven Compiler Plugin,但你需要根据我为遇到类似问题here 的人发现的做两件事:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <aspectj.version>1.8.1</aspectj.version>
</properties>

<!-- (...) -->

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.7</source>
        <target>1.7</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>1.7</source>
        <target>1.7</target>
        <Xlint>ignore</Xlint>
        <complianceLevel>1.7</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>

即你需要

  • 在 Maven Compiler Plugin 3.1 中使用增量编译(注意,开关取反了,这可能是一个 bug)和
  • 将执行阶段“process-sources”分配给 AspectJ Maven 插件 1.6。

应该可以的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多