【问题标题】:Spring + AspectJ weaving for java 8 using aspectj-maven-plugin使用 aspectj-maven-plugin 为 java 8 编织 Spring + AspectJ
【发布时间】:2014-10-02 06:40:37
【问题描述】:

我正在将我的项目从 java 7 迁移到 java 8,我遇到的问题与使用 aspectj-maven-plugin 的 aspectj 编织有关。

我可以根据Haus documentation 使用在 Java 6 和 7 上运行的插件成功配置编织。但问题是我还没有找到任何方法来使用(并找到)支持 java 8 的插件版本 7。我看到 here 插件 7 添加了 java 8 支持但找不到使用它的方法。

这是我需要的配置插件:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.7</version> <!-- AspectJ weaver plugin 7 is for java 8 (version 1.6 is for java 7) -->
          <configuration>
              <complianceLevel>1.8</complianceLevel>
              <source>1.8</source>
              <target>1.8</target>
          </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我确认使用 1.6 版的上述代码适用于 Java 7,但尝试使用 1.7 版时没有运气。

你知道如何在 Java 8 上运行 spring+aspectj 的 weaver 吗?

【问题讨论】:

  • 描述有些不清楚。究竟是什么不工作?您在控制台上看到任何错误消息吗?如果是这样,请发布它们。
  • @kriegaex 感谢您的提问。我可以解决这个非常困难的问题。我发布了答案也许可以帮助其他人。
  • 问题中的两个链接也坏了。由于您在 github 上拥有大部分数据,因此修复它们会很好。 :)
  • @VictorStafusa obrigado 我的朋友发表评论。不幸的是,CodeHaus 还没有迁移 aspectj 插件文档。我会继续检查以更新它。感谢您提出这个问题。

标签: java spring aspectj java-8 aspectj-maven-plugin


【解决方案1】:

2015 年 9 月之前正式发布之前的解决方案

经过许多头痛和数小时的努力,幸运的是我可以解决这个问题。这是我所做的:

要在 Java 8 中使用 aspectj-maven-plugin,我可以配置版本 aspectj-maven-plugin 1.7(请注意,aspectj-maven-plugin 1.6 适用于 Java 7)。

所以,maven 插件配置需要:

<!-- AspectJ configuration -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.7-SNAPSHOT</version>
    <configuration>
        <complianceLevel>1.8</complianceLevel>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

顺便说一下,需要的aspectJ jars是:

<!-- Spring AOP + AspectJ -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.0.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.1</version>
</dependency>

我一直在努力的最重要的事情是安装 aspectj-maven-plugin 1.7 jar,因为这些 jar/pom 文件还没有在 maven repo 上,所以我必须手动安装。

更新:所以,jar 文件可以从Haus Jira 链接下载(查看附件部分)。如果 Haus 不再可用,您可以从我的 github 下载它:

https://github.com/fedepia/aspectj-maven-plugin-1.7

下载并复制到我的本地仓库后,我需要在目录中创建我的自己的 aspectj-maven-plugin-1.7-SNAPSHOT.pom 文件:

.m2\repository\org\codehaus\mojo\aspectj-maven-plugin\1.7-SNAPSHOT\aspectj-maven-plugin-1.7-SNAPSHOT.pom

我基于1.6版本的副本但不得不修改以下内容:

<version>1.7-SNAPSHOT</version>

<properties>
    <aspectjVersion>1.8.1</aspectjVersion>
    <mavenVersion>2.2.1</mavenVersion>
    <changesPluginVersion>2.9</changesPluginVersion>
</properties>

就到这里了,希望对你有所帮助。

更新:(按照 Xtreme Biker 在 cmets 中的要求添加更多细节)

在我的上下文配置中,我有:

<aop:aspectj-autoproxy /> 

<bean id="notificationAspect" class="com.integration.core.aspect.NotificationAspect" factory-method="aspectOf" scope="singleton"></bean>

对于我使用的 java 方面:

@Aspect
public class NotificationAspect
{
   ...
   @AfterThrowing(pointcut="@annotation(com.integration.core.meta.NotifyOnFailure)", throwing="ex")
   public void executeOnException(JoinPoint joinPoint, ExternalApiExecutionException ex) throws Throwable
    {
    ...



自 2015 年 9 月以来终于发布了官方插件

这是对官方插件版本答案的更新。为了在 AspectJ 中使用 Java 8,可以在此链接上找到官方的 aspectj maven 插件:

http://www.mojohaus.org/aspectj-maven-plugin/usage.html

这里是maven仓库的链接:

http://mvnrepository.com/artifact/org.codehaus.mojo/aspectj-maven-plugin/1.8

正如文档所述,使用它的代码是:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.7</version>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.8</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
              <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  <build>
  ...
</project>

【讨论】:

  • +1,节省了我一些时间。不过,你的 spring-aop 版本有错字。
  • 感谢@drewmoore 的 +1。顺便说一句,你能指出错字是什么吗?
  • 我认为没有 spring-aop 版本 1.8.1,如果有的话,今天肯定已经过时了......(当前版本是 4.1 .0)
  • @drewmoore 完美!是的,你完全正确。我现在就修复它
  • @VictorStafusa 赶上来了。我有文件,我正在上传到 github :)。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
相关资源
最近更新 更多