如何扫描maven插件依赖?

How to scan maven plugin dependency?

在我的项目中,我将 commons-lang3 附加到插件,将 commons-io 附加到项目:

<build>
    <plugins>
        <plugin>
            <groupId>@project.groupId@</groupId>
            <artifactId>@project.artifactId@</artifactId>
            <version>@project.version@</version>
               (...)
            <dependencies>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                    <version>3.4</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
</dependencies>

在我的自定义插件中(在我的 mojo 中),我可以找到 commons-io

@Component
private MavenProject project;
(...)
project.getDependecies(); // [{groupId=commons-io, artifactId=commons-io...

如何找到commons-lang3?

由于 commons-lang3 仅被声明为特定插件的依赖项,因此在编译期间不可用。您必须将 commons-lang3 显式定义为依赖项(如果它没有作为传递依赖项包含在内)类似于您定义 commons-io 的方式。

使用 Maven API,您可以从 MavenProject 中获取 Build 实例,然后从中获取已配置插件的列表,然后您可以从每个插件对象中获取其依赖项,如下所示:

@Component
private PluginDescriptor pluginDescriptor;
(...)

List<Plugin> plugins = project.getBuild().getPlugins();
for (Plugin p : plugins) {
    if (p.getId().equals(pluginDescriptor.getId())) {
       List<Dependency> pluginDependencies = p.getDependencies();
       // your logic here
       break;
    }
}

如果您真的想面面俱到,您还可以扫描当前活动配置文件中配置的插件,如下所示:

List<Profile> profiles = project.getActiveProfiles();
for (Profile p : profiles) {
   // from personal experience, don't forget this check!
   if (p.getBuild() != null) {
        checkAsShownAbove(p.getBuild().getPlugins());
   }
}

希望对您有所帮助。