4

为什么<dependencies>for a<plugin>只能在该<build>部分中定义,而不是 的<reporting>部分pom

  • 为什么 Mavenpom.xml语法不允许<dependencies>in <reporting>
    • 如果用户只想配置插件<reporting>并设置依赖版本怎么办?
  • <build>本节中的插件如何/为什么使用依赖信息<reporting>

找到的文档,我在下面解释了为什么它没有回答这个问题(文档中的混乱实际上是我在这里问这个问题的原因!)。

根据我的阅读、观察和尝试,这是我目前的理解:

脚本部分中的插件<build>可以覆盖默认的依赖信息,这将影响该<reporting>部分中插件的依赖关系。因此,插件依赖信息不需要在<reporting>section中,只需要在<build>section中即可。

这个对吗?文档中是否有说明这一点的地方?<build>为了正确理解和<reporting>插件配置之间的关系,我缺少哪些细节<dependencies>

来自 Maven 文档

它在 Maven 文档中说Using the Reporting vs the Build Tag

使用<reporting>标签 VS<build>标签在 pom 的or元素中
配置报告插件没有相同的行为! <reporting><build>

mvn site
它仅使用在<configuration>元素中指定的每个报告插件的<reporting>元素中定义的参数,即站点总是忽略在 中<configuration>指定的每个插件的元素中定义的参数<build>

文档明确说不在and<configuration>之间共享,但我的问题是关于以及如何/为什么它们只在and never中声明。<build><reporting><dependencies><build><reporting>

似乎在中指定的依赖项<build> 确实会转移到<reporting>插件中。但这是我想要确认/解释的一点。

最小的例子

我遇到了这个问题,在运行时升级 CheckStyle 插件的依赖项以便与一起使用mvn site,所以这个最小的示例 POM 以 Checkstyle 插件为例演示了这个问题。

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>mylib</artifactId>
  <version>1.0</version>

  <build> 
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>3.0.0</version>
            <dependencies>
                <dependency>
                    <groupId>com.puppycrawl.tools</groupId>
                    <artifactId>checkstyle</artifactId>
                    <version>8.15</version> <!-- Update from default 6.18 to 8.15 -->
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>3.0.0</version>

        <!-- Uncommenting will cause syntax error, Dependencies can't be declared in reporting -->
        <!-- <dependencies>
          <dependency>
            <groupId>com.puppycrawl.tools</groupId>
            <artifactId>checkstyle</artifactId>
            <version>8.15</version>
          </dependency>
        </dependencies> --> 

      </plugin>
    </plugins>
  </reporting>
</project>
4

1 回答 1

0

我想说这里的情况不是那么简单——因为<dependencies>在这个部分是可能的<reporting>

我认为关键在于插件本身(因此每个插件可能会有所不同)。

但起初<build>和之间的区别是什么<reporting>

  • <build>在编译、测试期间使用 - 即在生成/分析/运行代码期间 - 与mvn clean install

  • <reporting>在生成文档期间使用mvn site

所以问题是 checkstyle 插件在文档生成期间是否需要您的依赖项 - 我猜不是 - 所以 checkstyle 拒绝<reporting>.

因此,为了证明报告中的依赖关系是可能的,请查看 spotbugs(另一个著名的分析器):

<build>
  <plugins>
    <plugin>
      <groupId>com.github.spotbugs</groupId>
      <artifactId>spotbugs-maven-plugin</artifactId>
      <version>3.1.12.1</version>
      <configuration>
        <xmlOutput>true</xmlOutput>
        <spotbugsXmlWithMessages>true</spotbugsXmlWithMessages>
        <spotbugsXmlOutputDirectory>target/site</spotbugsXmlOutputDirectory>
        <failOnError>false</failOnError>
        <includeTests>true</includeTests>
        <dependencies>
          <dependency>
            <groupId>com.mebigfatguy.fb-contrib</groupId>
            <artifactId>fb-contrib</artifactId>
            <version>7.4.3.sb</version>
          </dependency>

          <plugin>
            <groupId>com.h3xstream.findsecbugs</groupId>
            <artifactId>findsecbugs-plugin</artifactId>
            <version>LATEST</version>
          </plugin>
        </dependencies>
      </configuration>
    </plugin>
  </plugins>
</build>


<reporting>
  <plugins>
    <plugin>
      <groupId>com.github.spotbugs</groupId>
      <artifactId>spotbugs-maven-plugin</artifactId>
      <version>3.1.12.1</version>
      <configuration>
        <xmlOutput>true</xmlOutput>
        <spotbugsXmlWithMessages>true</spotbugsXmlWithMessages>
        <spotbugsXmlOutputDirectory>target/site</spotbugsXmlOutputDirectory>
        <failOnError>false</failOnError>
        <includeTests>true</includeTests>
        <dependencies>
          <dependency>
            <groupId>com.mebigfatguy.fb-contrib</groupId>
            <artifactId>fb-contrib</artifactId>
            <version>7.4.3.sb</version>
          </dependency>

          <plugin>
            <groupId>com.h3xstream.findsecbugs</groupId>
            <artifactId>findsecbugs-plugin</artifactId>
            <version>LATEST</version>
          </plugin>

        </dependencies>
      </configuration>
    </plugin>
  </plugins>
</reporting>

请注意这个例子 - 因为这里<dependencies><configuration>. 所以仔细阅读每个插件的文档总是明智的。

有关完整的 maven pom.xml,请查看我的小型 OpenSource TemplateEngine,其中包括许多不仅适用于 maven 的最佳实践。

于 2019-08-07T08:31:04.383 回答