使用 AspectJ 自动检测和编织依赖关系
Detect and weave dependencies automatically with AspectJ
我们有一个具有多个编译依赖项的 Maven 项目,每次添加新的 <dependency>
时,我们需要在
中创建一个等效的 <weaveDependency>
条目
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<weaveDependencies>
<weaveDependency>
<groupId>a-group</groupId>
<artifactId>new-dependency</artifactId>
</weaveDependency>
</weaveDependencies>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/classes/</weaveDirectory>
</weaveDirectories>
<complianceLevel>${java.version}</complianceLevel>
<showWeaveInfo>true</showWeaveInfo>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
这完全按照中所述进行
http://mojo.codehaus.org/aspectj-maven-plugin/examples/weaveJars.html
但是如果需要编织所有东西,这很容易导致问题,因为有人可能在添加新的<dependency>
后忘记添加<weaveDependency>
,那么有没有一种检测和编织所有东西的方法自动编译依赖?也许用另一个插件?
据我所知,没有这样的选项或插件,除非您决定为 AspectJ Maven 写一个或开一张票。
我们继续之前的一个问题:你真的确定要编织 所有 依赖项吗?方面 POM 中的 JUnit 或 Log4J 等库如何?
我通常将我的方面编织到代码中的方式——如果它们是生产方面而不仅仅是开发、调试或分析方面,也就是说——我用与你相反的方式来做:我使用我的每个模块中的 AspectJ Maven 插件直接将方面从源代码编译到我的代码中。所以在我的例子中,每个 Java 模块都依赖于一个方面模块,将它用作方面库。因为通常我的方面库比 Java 模块少得多,所以我不能轻易忘记包含它们。好的,我必须在每个模块中都这样做,但这是一个具有良好 IDE 的 no-brainer(全局搜索并替换所有 pom.xml我项目中的文件)。
如果你真的想做得更干净漂亮,你可以使用 Strategies for using AspectJ in a Maven multi-module reactor 中解释的方法,即你创建一个普通的根 POM 和一个以根 pom 作为它的方面根 POM parent。然后每个需要切面的Java模块可以使用切面根POM作为它的parent,其他Java模块直接使用根POM。
立即将方面编译到您的工件中的优点是每个工件没有两个 class 文件版本:一个没有方面的原始版本和一个在方面模块的 [=21] 中包含方面的编织版本=]目标目录。你会 而不是 按照我解释的方式去做的唯一原因是,如果出于某种原因你还需要没有方面代码的工件版本。但是,正如我所说,您可能会使用开发、调试或分析方面的内容。不管怎样,您仍然可以在生产方面使用我的方法,在开发方面使用您的旧方法。
我们有一个具有多个编译依赖项的 Maven 项目,每次添加新的 <dependency>
时,我们需要在
<weaveDependency>
条目
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<weaveDependencies>
<weaveDependency>
<groupId>a-group</groupId>
<artifactId>new-dependency</artifactId>
</weaveDependency>
</weaveDependencies>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/classes/</weaveDirectory>
</weaveDirectories>
<complianceLevel>${java.version}</complianceLevel>
<showWeaveInfo>true</showWeaveInfo>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
这完全按照中所述进行 http://mojo.codehaus.org/aspectj-maven-plugin/examples/weaveJars.html
但是如果需要编织所有东西,这很容易导致问题,因为有人可能在添加新的<dependency>
后忘记添加<weaveDependency>
,那么有没有一种检测和编织所有东西的方法自动编译依赖?也许用另一个插件?
据我所知,没有这样的选项或插件,除非您决定为 AspectJ Maven 写一个或开一张票。
我们继续之前的一个问题:你真的确定要编织 所有 依赖项吗?方面 POM 中的 JUnit 或 Log4J 等库如何?
我通常将我的方面编织到代码中的方式——如果它们是生产方面而不仅仅是开发、调试或分析方面,也就是说——我用与你相反的方式来做:我使用我的每个模块中的 AspectJ Maven 插件直接将方面从源代码编译到我的代码中。所以在我的例子中,每个 Java 模块都依赖于一个方面模块,将它用作方面库。因为通常我的方面库比 Java 模块少得多,所以我不能轻易忘记包含它们。好的,我必须在每个模块中都这样做,但这是一个具有良好 IDE 的 no-brainer(全局搜索并替换所有 pom.xml我项目中的文件)。
如果你真的想做得更干净漂亮,你可以使用 Strategies for using AspectJ in a Maven multi-module reactor 中解释的方法,即你创建一个普通的根 POM 和一个以根 pom 作为它的方面根 POM parent。然后每个需要切面的Java模块可以使用切面根POM作为它的parent,其他Java模块直接使用根POM。
立即将方面编译到您的工件中的优点是每个工件没有两个 class 文件版本:一个没有方面的原始版本和一个在方面模块的 [=21] 中包含方面的编织版本=]目标目录。你会 而不是 按照我解释的方式去做的唯一原因是,如果出于某种原因你还需要没有方面代码的工件版本。但是,正如我所说,您可能会使用开发、调试或分析方面的内容。不管怎样,您仍然可以在生产方面使用我的方法,在开发方面使用您的旧方法。