【问题标题】:Combined site/deploy goal for MavenMaven 的组合站点/部署目标
【发布时间】:2010-11-14 04:00:04
【问题描述】:

在 CI 服务器上运行 Maven 构建时,我会生成站点以发布文档和报告,并将工件部署到快照存储库以供其他项目使用。为此,我执行以下目标:

mvn clean site deploy

这意味着单元测试运行两次,一次用于站点生命周期,一次用于部署生命周期。如果我将站点目标配置为绑定到标准生命周期,测试仍会运行两次,由于 @requiresDependencyResolution 测试 注释,运行站点目标总是会导致测试运行。如果您只是创建站点,这很好,但在部署的上下文中,它会大大增加构建时间而没有任何好处。

我有一个解决方法,包括将 SiteMojo(和所需的父级)复制到新插件并从副本中删除 @requiresDependencyResolution 测试 注释。

这个修改后的 mojo 将生成报告,而不会强制再次运行测试,但我更喜欢不涉及对站点插件进行任何黑客攻击的解决方案。有没有办法抑制 requiresDependencyResolution 注释?

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    我很惊讶它的工作原理——@requiresDependencyResolution test 标签实际上并没有触发正在构建的测试——这应该是您包含的报告之一。通常情况下,我建议在 CI 中以单独的 Maven 执行运行站点和构建,以便您可以快速获得有关构建的反馈,并仅在成功时发布最新站点。

    另一种选择是将其作为mvn clean deploy site 运行,并为surefire-report-maven-plugin 选择report-only mojo(这通常是再次运行测试的报告)。这将使用之前的测试结果。当然,另一种选择是完全禁用该报告,因为无论如何您都可能从其他来源(例如 CI 服务器)获得这些结果。

    【讨论】:

      【解决方案2】:

      我目前的方法是创建一个新插件,其中包含来自 maven-site-plugin 的相关类型的副本。除了更改类型名称、目标名称和删除 @requiresDependencyResolution 测试 注释之外,这些类型与标准版本相同。

      复制的类型是:

      org.apache.maven.plugins.site.AbstractSiteMojo
      org.apache.maven.plugins.site.AbstractSiteRenderingMojo
      

      父 mojo 是必需的,因此 Maven 可以处理基于 javadoc 的注释(这对于 Maven 2.2.0+ 来说不应该是必需的)。

      org.apache.maven.plugins.site.SiteMojo
      org.apache.maven.plugins.site.SiteJarMojo
      

      这两个分别复制为 SiteOnlyMojo 和 SiteJarOnlyMojo , SiteJarOnlyMojo 改为继承自 SiteOnlyMojo 。否则,唯一的更改是更改目标名称并删除注释。

      所以 SiteOnlyMojo 有:

      * @goal site
      * @requiresDependencyResolution test
      

      改为:

      * @goal site-only
      

      SiteJarOnlyMojo 有:

      * @goal jar
      * @phase package
      

      改为:

      * @goal jar-only
      * @phase package
      

      这些类型在 maven-plugin 项目中声明,artifactId maven-site-only-plugin 具有在正确站点插件上声明的依赖项。

      为了使用它,我定义了一个配置文件(我不希望在每次执行时都运行报告,仅当在命令行上声明 -Psite 时)并将其绑定到 prepare-package 阶段(在 2.1.0 之前,您必须将其绑定到 package 阶段)。

      <profile>
        <id>site</id>
        <build>
          <plugins>
            <plugin>
              <artifactId>maven-site-only-plugin</artifactId>
              <version>1.0.0</version>
              <executions>
                <execution>
                  <phase>prepare-package</phase>
                  <goals>
                    <goal>jar-only</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </build>
      </profile>
      

      【讨论】:

        【解决方案3】:
        <build>
            <pluginManagement>
                <plugins>
                    ...
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-site-plugin</artifactId>
                        <version>3.2</version>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>site</goal>
                                    <goal>deploy</goal>
                                </goals>
                                <phase>deploy</phase> 
                           </execution>
                        </executions>
                    </plugin>
                    ...
                </plugins>
            </pluginManagement>
        </build>
        

        这将在发出“mvn deploy”命令时自动执行站点操作,并确保测试套件只执行一次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-20
          • 2010-11-07
          • 1970-01-01
          • 2011-01-15
          • 2015-10-31
          • 1970-01-01
          • 1970-01-01
          • 2010-11-18
          相关资源
          最近更新 更多