0

我们有一个具有多个编译依赖项的 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>在添加 new 之后忘记添加<dependency>,那么有没有一种方法可以自动检测和编织所有编译依赖项?也许与另一个插件?

4

1 回答 1

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 的方面根 POM它的父母。然后每个需要切面的Java模块可以使用切面根POM作为其父级,其他Java模块直接使用根POM。

立即将切面编译到您的工件中的优点是每个工件没有两个类文件版本:一个没有切面的原始版本和一个在切面模块的目标目录中带有切面的编织版本。您不按照我解释的方式执行此操作的唯一原因是,如果出于某种原因您还需要没有方面代码的工件版本。但是,正如我所说,您可能会使用开发、调试或分析方面。尽管如此,您仍然可以将我的方法用于生产方面,并将您的旧方法用于开发方面。

于 2015-04-04T09:17:58.797 回答