【问题标题】:Maven AspectJ plugin non spring project won't workMaven AspectJ 插件非 spring 项目将不起作用
【发布时间】:2019-05-19 18:13:51
【问题描述】:

我有一个项目,它不是 Spring 应用程序。我正在尝试在其中使用 AspectJ 注释。 Annotation 类是从我拥有的另一个 jar 中引用的。我在下面提到了我的 POM 插件部分。我的构建成功,但 Maven 的控制台输出从未提及有关 AspectJ 插件的任何内容,而且当我运行我的项目时,注释也不起作用。

几个小时以来我一直试图找出问题所在,但无法弄清楚。

<pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.4</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <showWeaveInfo>true</showWeaveInfo>
                    <aspectLibraries>
                        <aspectLibrary>
                            <groupId>it.cvc.ciscocommerce.lps.lp-commons</groupId>
                            <artifactId>lp-commons</artifactId>
                        </aspectLibrary>
                    </aspectLibraries>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warName>listpriceservice</warName>
                </configuration>
            </plugin>
            <!-- Plugin for sdaas deployment. For compressing war to tar.gz -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>src/main/resources/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.5.201505241946</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-report</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </pluginManagement>

这是我试图用作方面库的 Jar 中定义的两个依赖项。

<dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.7.4</version>
</dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjtools</artifactId>
        <version>1.7.4</version>
    </dependency>

jar 编译得很好,我打算在另一个 SPRING 应用程序中使用它,但不是这个。在 SPRING 应用程序中,我什至没有定义 maven aspect 插件。

当我运行 maven 构建时,在控制台中我只看到列出的以下插件。

[DEBUG] 目标:org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) [DEBUG] 样式:常规

[DEBUG] 目标:org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) [DEBUG] 样式:常规

[DEBUG] 目标:org.apache.maven.plugins:maven-resources-plugin:2.6:testResources (default-testResources) [DEBUG] 样式:常规

[DEBUG] 目标:org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-testCompile) [DEBUG] 样式:常规

[DEBUG] 目标:org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) [DEBUG] 样式:常规

[DEBUG] 目标:org.apache.maven.plugins:maven-war-plugin:2.4:war (default-war) [DEBUG] 样式:常规

编辑:在阅读了 kriegaex 的回答以及关于 pluginManagement vs plugins 的内容后,我将我的 POM 更改如下。请注意,我的项目不是多模块的,它只有一个 POM。

<plugins>
        <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.4</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <showWeaveInfo>true</showWeaveInfo>
                    <aspectLibraries>
                        <aspectLibrary>
                            <groupId>it.cvc.ciscocommerce.lps.lp-commons</groupId>
                            <artifactId>lp-commons</artifactId>
                        </aspectLibrary>
                    </aspectLibraries>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <warName>listpriceservice</warName>
            </configuration>
        </plugin>
        <!-- Plugin for sdaas deployment. For compressing war to tar.gz -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>src/main/resources/assembly.xml</descriptor>
                </descriptors>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.5.201505241946</version>
            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

当我这样做时,我在 AspectJ 执行下的执行标记上收到以下错误

生命周期配置未涵盖插件执行:org.codehaus.mojo:aspectj-maven-plugin:1.4:compile (execution: default, phase: process-sources)

更新我将此问题标记为已回答,因为我最初的 AspectJ 插件未被调用的问题已解决。我将就我的另一个问题提出一个新问题。感谢 kriegaex 为我指明了正确的方向。

【问题讨论】:

    标签: eclipse maven build aspectj aspectj-maven-plugin


    【解决方案1】:

    我认为这是一个经典的问题,根本没有 AspectJ 问题,而是使用 Maven 的初学者的错误:

    您已在 &lt;pluginManagement&gt; 部分中定义了插件的默认设置,但后来忘记在单独的 &lt;plugins&gt; 部分中引用它们。因此,Maven 根本不知道您想使用它们。


    更新:

    好的,我将详细说明,因为您似乎仍然无法理解如何使用&lt;pluginManagement&gt;&lt;plugins&gt;:您使用前者来定义插件的版本、范围和默认设置。然后,您使用后者以便在您需要它们的(可能是多模块)项目的任何模块中轻松引用预定义(托管)插件,而无需复制/粘贴相同的版本和配置。所以它不是“使用这个或那个”,而是“同时使用它们并以一种聪明的方式组合它们”。示例:

    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>my.group.id</groupId>
                <artifactId>my-plugin-name</artifactId>
                <version>1.2.3</version>
                <configuration>
                    <something>foo</something>
                </configuration>
            </plugin>
            <plugin>
                <groupId>my.group.id</groupId>
                <artifactId>my-other-plugin-name</artifactId>
                <version>4.5</version>
                <scope>test</scope>
                <configuration>
                    <blah>xyz</blah>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    

    然后在同一个模块或另一个模块中以前者为父模块或将其作为 BoM(材料清单)导入:

    <plugins>
        <plugin>
            <groupId>my.group.id</groupId>
            <artifactId>my-plugin-name</artifactId>
        </plugin>
        <plugin>
            <groupId>my.group.id</groupId>
            <artifactId>my-other-plugin-name</artifactId>
        </plugin>
    </plugins>
    

    看到了吗?非常干净和简单。

    顺便说一下,这类似于&lt;dependencyManagement&gt;&lt;dependencies&gt; 之间的区别。

    您还可以在 &lt;plugins&gt; 部分扩展或覆盖托管插件的配置,因此您不受预配置的限制。

    至于为什么有些托管插件没有在&lt;plugins&gt; 部分中明确提及它们就可以工作:它们是在您的父 POM 或 Maven 根 POM 中配置的,例如依赖插件、编译插件和其他预定义和预配置的插件Maven 基础插件。如果你让 Maven 为你的模块显示有效的 POM,你会看到它们。

    AspectJ Maven 插件当然不是 Maven 基础插件,因此您必须自己配置它,这就是您想要做的。

    【讨论】:

    • 中定义。所有其余的插件都可以工作。它构建良好。不明白你指的是什么。
    • 好的,所以我用谷歌搜索了一下,发现 之间有什么区别。因此,当我将所有内容都放在 下时,aspectj 插件会在 标记下抱怨。所以我现在只在 和那个 下保留了 aspectj 插件,并将其他所有内容移动到一个单独的 标记下,并且还添加了 maven-dependency-plugin。即使现在它构建良好,但 AspectJ 无法正常工作。
    • 查看我的更新,了解如何以正确的方式结合 Maven 插件管理和使用。 Maven 文档对它进行了更详细的解释,但是对于初学者来说有时很难理解,所以我在这里省略了一些细节。至于你关于为什么“AspectJ 不起作用”的问题,正如你所说,这句话几乎不符合可重现的错误描述。你似乎在另一个模块中使用了一个方面模块,所以你在这里有一个多模块设置。可能有很多错误来源。请在 GitHub 上为我发布 MCVE,以便我可以帮助您。
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多