如何强制 Maven 在站点生命周期之前 运行 构建生命周期?

How to force maven to run build-lifecycle before site-lifecycle?

在花了几个小时试图找出问题所在后,我得出了我需要知道的结论:

如何强制 Maven 严格按照以下顺序执行生命周期阶段清理、构建和站点:clean -> build -> site?

问题/场景:

我必须对具有相同模块的多模块项目进行处理:

pSuccess
|-pSuccessClient
|-pSuccessEJB (has pSuccessClient as dependency)
|-pSuccessEAR (has pSuccessEJB as dependency)

pFail
|-pFailClient
|-pFailEJB (has pFailClient as dependency)
|-pFailEAR (has pFailEJB as dependency)

这两个项目在我们的中央 nexus 工件存储库中都有用于快照和发布的分发存储库,但是 none 已经部署到它,这意味着 nexus 是空的。

当我运行 mvn clean package sitepSuccess-project 上删除目标目录(clean-lifecycle),然后模块全部构建(build-lifecycle),最后报告是在新构建的模块上正确生成的(站点生命周期)——构建成功!在 "debugging" 这个过程中,我发现在构建生命周期中,所需的 clientDependency 被放置在 lokal maven 存储库中,然后用于 EJB,与用于 EAR 模块的 EJB 相同。工作顺利。

但是当我在 pFail-project 上执行相同的操作时,maven 在清理生命周期之后执行站点生命周期,在构建生命周期之前 执行站点生命周期。如您所料,这会导致构建失败,因为 Maven 找不到 EJB 所需的依赖项(客户端)。这是非常本地化的,因为它还没有被构建。每次我 运行 命令时,我都可以强制执行此结果。没有构建生命周期的阶段 运行 - 没有编译,什么都没有。 Maven 尝试首先执行站点生命周期。只有当我 运行 一个 mvn clean deploy 然后另一个 mvn clean package site 时,构建才会成功,因为然后从关系中读取人工制品。但是 site-lifecycle 再次在 build-lifecycle 之前执行。 注意 仅通过 mvn clean package 构建项目工作正常,没有任何问题。所有模块都以正确的顺序构建。但是当我添加 site 生命周期时它失败了。

我读了 maven documentation about lifecycle 但我不明白为什么 sitebuild 之前是 运行。在 SO 上的一些问题中,我读到应在同一阶段执行的插件按照它们在 pom.xml 中列出的顺序执行。所以我也检查了一下,但是 <build> 标签是在 <reporting> 标签之前定义的。

那么,为什么 Maven 在我的一个项目中的构建生命周期之前执行站点生命周期,以及如何强制 Maven 以正确的顺序执行生命周期:clean -> build -> site ?

P.S: 运行 windows 7.

命令行中的所有 maven 命令

编辑

我知道生命周期和阶段,这意味着我知道 packageinstalldeploy 之间的区别是 - 这不是问题的一部分!

对于那些不相信执行顺序的人:这是我 运行 mvn clean install site 时的输出,表明 site-lifecycle 在 build-lifecycle 之前执行。我 运行 mvn clean package sitemvn clean install site 都没有关系。同样,运行ning single mvn clean package(或安装)工作正常,但当我也想生成站点时却不行。然后先执行site。

再挖掘几个小时后,我找到了解决问题的方法:

两个项目都使用maven-javadoc-plugin进行报告

<reporting>
  ...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>${maven.javadoc.version}</version>
    <!-- DocLint je nach Profil ausschalten (siehe oben) -->
    <configuration>
      <additionalparam>${javadoc.opts}</additionalparam>
    </configuration>
  </plugin>
...
</reporting>

在失败项目的 EJB 中,我们还在构建生命周期的 generate-sources 阶段使用 build-helper-maven-plugin

<build>
  ...
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.7</version>
    <executions>
      <execution>
        <id>add-source</id>
        <phase>generate-sources</phase>
        <goals>
          <goal>add-source</goal>
        </goals>
    ....
  </plugin>
  ...
</build>

两个插件似乎在 generate-sources 阶段发生冲突。

maven-javadoc-plugin 更改为使用以下内容后 ReportSet 网站生成工作正常

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>${maven.javadoc.version}</version>
    <!-- Disable DocLint correspondening to java version -->
    <configuration>
      <additionalparam>${javadoc.opts}</additionalparam>
    </configuration>
    <reportSets>
      <reportSet>
        <reports>
          <report>javadoc-no-fork</report>
          <report>test-javadoc-no-fork</report>
        </reports>
      </reportSet>
    </reportSets>        
  </plugin>

我仍然不太明白为什么它会合并,但至少我的项目在运行。