使用AspectJ自动检测和编织依赖项

时间:2015-04-02 11:00:03

标签: aspectj aspectj-maven-plugin

我们有一个具有多个编译依赖项的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

但是如果需要编织所有东西,这很容易导致问题,因为有人在添加新的<weaveDependency>之后可能忘记添加<dependency>,所以有没有办法检测和编织所有编译依赖项自动?也许用另一个插件?

1 个答案:

答案 0 :(得分:1)

AFAIK没有这样的选项或插件,除非您决定为AspectJ Maven写一张或打开一张票。

我们继续之前的一个问题:你真的确定要编织所有依赖项吗?那么像POM中的JUnit或Log4J这样的库呢?

我通常将方法编织到代码中的方式 - 如果它们是生产而不仅仅是开发,调试或分析方面,那就是我以相反的方式做到这一点:我使用AspectJ Maven我的每个模块中的插件都可以直接将方面从源代码编译到我的代码中。因此,在我的情况下,每个Java模块都依赖于一个方面模块,将其用作方面库。因为通常我的方面库比Java模块少,所以我不能轻易忘记包含它们。好的,我必须在每个模块中执行此操作,但这是一个很好的IDE(在我的项目中的所有 pom.xml 文件上进行全局搜索和替换)。

如果你真的想要更干净,更好地完成它,你可以使用Strategies for using AspectJ in a Maven multi-module reactor中解释的方法,即你创建一个普通的根POM和一个根pom作为其父根。然后每个需要方面的Java模块都可以使用方面根POM作为其父节点,其他Java模块直接使用根POM。

立即将方面编译到工件中的优点是每个工件都没有两个类文件版本:没有方面的原始文件和方面模块中 target <方面的编织版本/ em>目录。您解释的唯一原因是这样做是因为出于某种原因您还需要没有宽高比代码的工件版本。但是,正如我所说,你可能会使用开发,调试或分析方面。尽管如此,您仍然可以将我的方法用于生产方面,并将旧方法用于开发工作。