【问题标题】:Can the maven aspectj plugin weave aspects written via annotations?maven aspectj 插件可以编织通过注释编写的方面吗?
【发布时间】:2013-06-15 00:51:59
【问题描述】:

我有一个项目,我想使用方面但不使用 spring。所以我正在使用AspectJ。在我的特定场景中,LTW 对我不起作用,所以我必须使用 CTW,这导致我使用了 maven aspectj 插件。我目前正在使用 Java 7。我正在将一个 maven 模块中编写的方面编织到另一个模块中,该模块将其作为依赖项。

当我编织非注释方面时,插件似乎正确编织,但是当我将其切换到基于注释的方面时,插件似乎没有写入 hasaspect() 和 aspectof() 方法因为在运行时我得到异常说方法不存在。

我尝试的一件事是让基于注释的切面扩展 Aspects 类,希望它能够找到方法,但这也没有用。

我的插件是这样配置的:

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

我必须做的是恢复到普通的旧无注释方面样式。但这是一个拖累,因为我不能从方法中抛出异常(或者至少到目前为止,我不知道如何)。抛出异常对于诸如安全之类的事情特别有用,如果用户没有访问权限,异常将是提醒调用者的适当方式。

提前致谢。

【问题讨论】:

  • 大约一周前,我在使用相同的插件时遇到了类似的问题。我不知道您的代码是否与我的相同,但我必须在具有方面的模块和包含建议类的模块上都使用插件。该插件调用 ajc 将所需的方法添加到方面。它还调用 ajc 将您的建议包装在带注释的类周围(之前/之后)。我提出的问题(到目前为止尚未回答)在这里:stackoverflow.com/questions/17075862/…。那里有一个指向我在 github 中的示例代码的链接。
  • 实际上,是的,我忘了提到我在包含方面的模块以及包含建议类的模块上都运行了插件。插件配置是相同的,当然除了aspectlibraries节点。
  • 顺便说一句,我想我对你提出的问题有意见。在那里检查我的答案。

标签: annotations aspectj aspectj-maven-plugin


【解决方案1】:

我有几乎完全相同的设置工作(我离开了 Spring,Google App Engine 只支持编译时编织),并部署了一个多模块 EAR。

从您的问题来看,您似乎没有找到 AspectJ Multi-Module documentation 并在您的设置中使用它。通过更仔细地查看您的 POM,我发现在您的执行部分中,您没有任何用于测试编译阶段的内容。此外,您应该获得尽可能多的信息:将 verbose 和 showWeaveInfo 设置为 true。这应该会给你一个更好的谷歌错误(并且可能会被指向 StackOverflow)或寻求帮助。

我的处决部分如下

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

在获得更多信息之后,您应该能够按照建议进行测试编译和设置项目。

【讨论】:

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