如何强制 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 site
在pSuccess
-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 但我不明白为什么 site
在 build
之前是 运行。在 SO 上的一些问题中,我读到应在同一阶段执行的插件按照它们在 pom.xml
中列出的顺序执行。所以我也检查了一下,但是 <build>
标签是在 <reporting>
标签之前定义的。
那么,为什么 Maven 在我的一个项目中的构建生命周期之前执行站点生命周期,以及如何强制 Maven 以正确的顺序执行生命周期:clean -> build -> site
?
P.S: 运行 windows 7.
命令行中的所有 maven 命令
编辑
我知道生命周期和阶段,这意味着我知道 package
、install
、deploy
之间的区别是 - 这不是问题的一部分!
对于那些不相信执行顺序的人:这是我 运行 mvn clean install site
时的输出,表明 site-lifecycle 在 build-lifecycle 之前执行。我 运行 mvn clean package site
或 mvn 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>
我仍然不太明白为什么它会合并,但至少我的项目在运行。
在花了几个小时试图找出问题所在后,我得出了我需要知道的结论:
如何强制 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 site
在pSuccess
-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 但我不明白为什么 site
在 build
之前是 运行。在 SO 上的一些问题中,我读到应在同一阶段执行的插件按照它们在 pom.xml
中列出的顺序执行。所以我也检查了一下,但是 <build>
标签是在 <reporting>
标签之前定义的。
那么,为什么 Maven 在我的一个项目中的构建生命周期之前执行站点生命周期,以及如何强制 Maven 以正确的顺序执行生命周期:clean -> build -> site
?
P.S: 运行 windows 7.
命令行中的所有 maven 命令编辑
我知道生命周期和阶段,这意味着我知道 package
、install
、deploy
之间的区别是 - 这不是问题的一部分!
对于那些不相信执行顺序的人:这是我 运行 mvn clean install site
时的输出,表明 site-lifecycle 在 build-lifecycle 之前执行。我 运行 mvn clean package site
或 mvn 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>
我仍然不太明白为什么它会合并,但至少我的项目在运行。