Spring-Boot 2 AspectJ加载时间编织

时间:2018-12-09 14:28:29

标签: spring-boot aspectj spring-boot-maven-plugin load-time-weaving

我正在尝试使用Spring Boot 2和AspectJ加载时间编织。 我能够从Eclipse运行测试和应用程序(向VM添加两个代理:Aspectjweaver和spring-instrument),来自Maven的surefire也可以正常运行,但是我无法向spring-boot-maven-plugin添加两个代理。

这是我的pom.xml代码段

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>
            -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
            -javaagent:"${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar"
            -Dspring.profiles.active=test</argLine>
    </configuration>
</plugin>
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <agent>
            ${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
        </agent>
        <agent>
            ${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar
       </agent>
    </configuration>
</plugin>

看起来像spring-boot-maven-plugin只会将spring-instrument附加到VM。 (实际上,始终是pom的最后一个“代理”条目。

任何人都有一个主意,如何使它起作用?

我正在使用Java 8,Spring Boot 2.1.0.RELEASE(AspectJ 1.9.2和Spring 5.1.2RELEASE)。

1 个答案:

答案 0 :(得分:1)

根据plugin documentationagent参数是一个文件数组,即应该有一种方法可以指定多个文件。查看源代码,我还可以看到,如果实际上指定了多个代理,它们都将添加到命令行参数列表中。

现在悬而未决的问题是如何指定多个代理?通常在Maven插件中,如果存在数组元素,则命名是带有多个“ s”的事物,例如“ agents”,并且在内部您将对元素使用单数“ agent”。但是这里的array元素已经是单数了。

为什么Spring团队在这里没有这样做,我却一无所知。但是,在尝试使用Maven参数-X并检查调试输出时,我看到您使用的任何子标签都可以正常工作。您可以使用

<agent>
    <agen>foo</agen>
    <agen>bar</agen>
</agent>
<agent>
    <x>foo</x>
    <y>bar</y>
</agent>
<agent>
    <agentElement>foo</agentElement>
    <agentElement>bar</agentElement>
</agent>

由于缺乏更好的约定,我建议使用后者。无论如何,仅重复两个顶级agent标签并不能解决问题。

由于缺乏完整的项目,我尚未测试的是命令行上的两个代理是否实际上正确启动了Spring Boot。那部分取决于你。

更新:我刚刚举起了相应的Spring Boot issue #15455

更新2: Spring Boot问题已解决,在2.2.0版中,该参数应重命名为agents,因此使用多个{{1 }}里面的条目。