问题 找不到spring-aspects-4依赖


我想将我的项目升级到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. 由于这种依赖的范围是  为什么我的应用程序需要它?我不想编译spring-aspects.jar !!

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

谢谢


1090
2017-12-20 07:22


起源

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


答案:


根据 在泉源报道的一个问题,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而不是里程碑版本,并且暂时是我可接受的解决方法。


8
2017-12-23 10:00



你能回答我的问题1:“由于这种依赖的范围是编译,为什么我的应用程序需要它”?此外,在springource的jira中提到“如果仍然需要一段时间,我们可能必须正式记录如何用AspectJ 1.7替换那些依赖于那里的人”。您是否也可以将此包含在您的答案中(将1.8.0.M1的依赖项替换为aspect.4weaver的1.7.4)? - Serafeim
范围“compile”的依赖关系并不意味着您将实际编译它。它只表示您需要工件来编译项目。如果你使用“mvn包”,它也会包含在war文件中。顺便说一句,编译范围是默认范围。 - reidarok


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

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

这将使您可以访问aspectjrt,aspectjweaver和aspectjtools的1.8.0.M1版本。

但是,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依赖项,则会出现“无法在maven central中找到*依赖项”错误。要解决此问题,请将依赖项复制到主依赖项元素; mvn clean编译;删除复制的依赖项;和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”日志记录要好得多。

希望这可以帮助。就像我之前的许多人一样,花了很多啤酒来解决这个问题。;)


6
2017-12-24 23:42



+1这是一个非常详细的解释。如果您有时间,请添加一个示例以支持您所做的以下陈述。 “您可以在spring-aspects 4.0.0依赖项中的aspectjweaver 1.8.0.M1上插入一个排除项。这可能允许您将Spring 4与Java 7以及所有1.7.4 aspectj *依赖项一起使用。” - Joshua Wilson
FWIW,我更新了pom.xml以反映最新版本的Spring和Aspectj。 Aspectj-maven-plugin尚未针对Java 8进行更新。 - javawerks
pom.xml包含与原始帖子相关的详细注释,希望能让事情更清晰一些。 - javawerks