【问题标题】:Cannot find a spring-aspects-4 dependency找不到 spring-aspects-4 依赖项
【发布时间】:2013-12-20 07:22:07
【问题描述】:

我想将我的项目升级到 spring 4,但是,我缺少 aspectweaver-1.8.0.M1.jar 的依赖项。当我查看依赖层次结构时,我看到spring-aspects-4.0.0需要这个文件,它在自己的pom.xml中有以下内容

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.0.M1</version>
  <scope>compile</scope>
</dependency>

检查 maven 存储库后,我找不到这个工件,因为 aspectweaver 的最新稳定版本是 1.7.4。

现在我无法理解两件事:

  1. 既然这个依赖的范围是compile,为什么我的应用需要它呢?我不想编译 spring-aspects.jar !!

  2. 为什么 spring-aspects-4.0.0.jar( 稳定)使用 非稳定 版本的组件?这不会使 spring-aspects-4.0.0 也不稳定吗?

谢谢

【问题讨论】:

  • 您可能需要添加适当的里程碑存储库;我不知道是哪几个。关于 spring-aspects 依赖的好问题,我会针对它提交一个错误。
  • 我再次检查了 spring-aspects 的依赖关系,但找不到任何里程碑存储库!从哪里下载 aspectjweaver 1.8.0.M1 ??
  • 似乎在依赖管理中使用了gradle。在文件github.com/spring-projects/spring-framework/blob/v4.0.0.RELEASE/… 中我可以看到ext.aspectjVersion = "1.8.0.M1"

标签: java spring maven spring-aop


【解决方案1】:

根据a reported issue at springsource,aspectjweaver“与 AspectJ 1.7 基本相同”,只是它早期支持 Java 8。

由于我不需要 Java 8 支持,所以我基本上是在 aspectweaver 的最新发布版本中添加了一个编译依赖项:

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.7.4</version>
</dependency>

这可确保使用 1.7.4 而不是里程碑版本,并且暂时对我来说是可接受的解决方法。

【讨论】:

  • 您能否也回答我的问题 1:“既然此依赖项的范围是编译,为什么我的应用程序需要它”?此外,在 springsource 的 jira 中提到“如果这仍然需要一段时间,我们可能必须正式记录如何用 AspectJ 1.7 替换该依赖项以供任何相关人员使用”。您能否也将其包含在您的答案中(将 1.8.0.M1 的依赖项替换为 aspectjweaver 的 1.7.4)?
  • 范围为“compile”的依赖项并不意味着您将实际编译它。这仅意味着您需要该工件来编译您的项目。如果您执行“mvn 包”,它也包含在 war 文件中。顺便说一句,编译范围是默认范围。
【解决方案2】:

要解决 aspectjweaver 依赖关系,请添加此存储库:

<repository>
    <id>spring-milestones</id>
    <url>http://repo.spring.io/milestone</url>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
</repository>

这将使您能够访问 1.8.0.M1 版的 aspectjrt、aspectjweaver 和 aspectjtools。

但是,aspectj-maven-plugin 1.6 版不支持 Java 8。

然而 spring-aspects-4.0.0 依赖于 aspectjweaver 1.8.0.M1 以获得 Java 8 支持。

如果您使用的是 Spring 3.2.6 和 Java 7,则此 aspectj-maven-plugin 配置有效:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.6</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <complianceLevel>1.7</complianceLevel>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
                <showWeaveInfo>true</showWeaveInfo>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

您也许可以在 spring-aspects 4.0.0 依赖项中的 aspectjweaver 1.8.0.M1 上插入排除项。这可能允许您将 Spring 4 与 Java 7 以及所有 1.7.4 aspectj* 依赖项一起使用。

为了在 Spring 4/Java 8 项目中应用编译时编织 (CTW),我遇到了以下帖子:

  1. Maven, Scala, Spring, AspectJ

  2. https://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/making-lombok-aspectj-and-maven-co-exist

这是我的解决方案:https://github.com/javawerks/homeschool/blob/master/pom.xml

有效!请注意,此解决方案使用 3 aspectj* amigos 的 1.8.0.M1 版本,可在此处找到:http://repo.spring.io/milestone/org/aspectj/

警告:如果您的本地 maven 存储库还没有 maven-antrun-plugin 依赖项,您将收到“can't find * dependency in maven central”错误。要解决此问题,请将依赖项复制到您的主要依赖项元素; mvn 清理编译;删除复制的依赖项;并且 maven-antrun-plugin 应该找到 aspectj* 依赖项。然后执行 'mvn clean install' 并验证 ajc 日志记录。

最后,在 Intellij 中,您将看到此 iajc 属性出现“无法解析符号”错误:

aspectPath="${org.springframework:spring-aspects:jar}"

不用担心,它按预期工作。这是一个 maven-antrun-plugin 命名约定。

总有一天,aspectj-maven-plugin 将更新为支持 Java 8,然后我们就可以恢复正常了。也就是说,showWeaveInfo="true" 日志记录要好得多。

希望这会有所帮助。像我之前的许多人一样,花了很多啤酒才弄清楚这一点。;)

【讨论】:

  • +1 这是一个非常详细的解释。如果您有时间,请添加一个示例来支持您所做的以下陈述。 “您可能能够在 spring-aspects 4.0.0 依赖项中的 aspectjweaver 1.8.0.M1 上插入排除项。这可能允许您将 Spring 4 与 Java 7 以及所有 1.7.4 aspectj 一起使用*依赖关系。”
  • FWIW,我更新了 pom.xml 以反映 Spring 和 Aspectj 的最新版本。 aspectj-maven-plugin 仍未针对 Java 8 进行更新。
  • pom.xml 包含相对于原始帖子的详细 cmets,希望能让事情更清晰。
猜你喜欢
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2020-03-31
  • 2020-11-11
  • 2021-01-21
  • 2017-04-11
相关资源
最近更新 更多