Maven 多模块POM-创建一个有效的站点

Maven 多模块POM-创建一个有效的站点,maven,maven-site-plugin,Maven,Maven Site Plugin,我有一个多模块的应用程序,我正在尝试为这个应用程序生成一个Maven站点 我有一个包含所有子模块的聚合POM,一个包含子模块所有公共特性的继承POM,以及20个左右的子模块 我在网上循环浏览了无数的例子,看看如何让它发挥作用。所有这些都不涉及本工作的多模块部分。我可以在子级(和聚合模块)的目标/站点文件夹中获得单个站点输出。我还将其暂存到聚合POM中的目标/暂存文件夹中。创建的东西看起来不错 但是: 所有子模块链接都不起作用 我试着在jetty下运行它,因为一些关于这个问题的评论说链接只有在作为

我有一个多模块的应用程序,我正在尝试为这个应用程序生成一个Maven站点

我有一个包含所有子模块的聚合POM,一个包含子模块所有公共特性的继承POM,以及20个左右的子模块

我在网上循环浏览了无数的例子,看看如何让它发挥作用。所有这些都不涉及本工作的多模块部分。我可以在子级(和聚合模块)的目标/站点文件夹中获得单个站点输出。我还将其暂存到聚合POM中的目标/暂存文件夹中。创建的东西看起来不错

但是:

所有子模块链接都不起作用

我试着在jetty下运行它,因为一些关于这个问题的评论说链接只有在作为网站构建时才起作用——但没有,同样的问题,它找不到孩子的index.html

有人举过这样的例子吗?为了避免我扯掉更多的头发(天知道它正在运行),我宁愿看到实际工作的POM代码和/或正确测试和部署所遵循的阶段


有人能帮忙吗?

子链接在您当前的项目中不起作用。您需要执行一个任务,否则它将不起作用。您需要定义stagingDirectory,它定义的目标位置必须是一个绝对路径。

好的,终于可以工作了

将此(仅)添加到父POM,根据需要更改暂存文件夹:


org.apache.maven.plugins
maven站点插件
3
C:\temp\stage
org.apache.maven.plugins
maven项目信息报告插件
2.4
org.apache.maven.plugins
maven javadoc插件
2.8
非骨料
${project.build.sourceDirectory}/./已生成
javadoc
总数的
${project.build.sourceDirectory}/./已生成
总数的
org.apache.maven.plugins
maven surefire报告插件
2.6
将此项添加到父项的分发管理部分:

<site>
  <id>${project.artifactId}-site</id>
  <url>./</url>
</site>

这应该部署到带有工作链接的临时/站点。

自上一个解决方案以来已经有一年多了

我不喜欢这种变通方法,必须有另一种解决方案“maven方式”

这就是:

在Maven站点插件常见问题解答中:

另一方面,在多模块生成中使用来构造相对链接[…]。在多模块生成中,父模块和子模块具有不同的URL非常重要

必须使用不同的URL在每个pom.xml中声明标记:

父POM:

<distributionManagement>
  <site>
    <id>mysite</id>
    <name>My Site</name>
    <url>ftp://server.example.com/htdocs/site/</url>
  </site>
</distributionManagement>
注意:如果子2依赖于子1,则需要目标包。使用包,执行目标站点时不会出现存储库中缺少依赖项的错误

编辑:必须为使用与中相同路径的每个工件提供一个路径。这是因为report info插件生成的index.html使用计算相对路径,而site:stage使用

我找到了一个“更简单”的解决方案来配置
阶段
目标。它将自动聚合
${project.baseURI}/target/staging
文件夹中每个模块的文档。诀窍是将其添加到所有子模块的父pom中:


${project.artifactId}-站点
${project.baseUri}


来自pom聚合器。然后查看
target/staging
文件夹。您将正确链接子模块文档

我有一个与OP类似的情况,但有一个扭曲:其中一个子模块不是从多模块项目父模块继承的。我想生成一个所有链接都能正常工作的分阶段站点。以下是项目结构:

extraParent     // parent not part of this multi-module build
foo
  pom.xml       // aggregator
  fooParent     // parent for this project
  module1       // inherits from fooParent
  extraModule   // inherits from extraParent
@斯特凡的回答是朝着正确方向迈出的一大步。特别是,我确认子模块必须重复
distributionManagement
url
元素。我在fooParent中尝试过:

<properties>
  <foo.site.url>file://somePath/foo/${project.artifactId}</foo.site.url>
</properties>

<url>${foo.site.url}</url>
<distributionManagement>
    <site>
        <id>site-docs</id>
        <url>${foo.site.url}</url>
    </site>
</distributionManagement>

现在,当我使用
mvn site site:stage
为多模块项目生成站点时,所有链接都可以正常工作。

这与您想象的不完全一样。常见问题解答对此进行了描述

我不是Maven的专家,但这就是我如何在本地生成站点的原因:

  • 在根POM中配置

  • 生成。这“根据POM部分中指定的站点URL将生成的站点部署到本地暂存或模拟目录。”

  • 默认情况下,站点将在
    ${project.build.directory}/staging
    目录下生成


  • 给迷路的人一些建议。运行
    mvn site site:stage
    后,
    site
    目录将不包含将位于
    staging
    目录中的合成站点。根据报告,在部署站点之前,不会进行合成。转移后,您可以调用
    mvn site:deploy
    将合成的站点复制到您在distributionManagement中定义的url中指定的位置

    
    网站
    文件://${project.build.directory}/completesite
    
    在这种情况下,已完成的站点最终将位于项目构建目录(通常为
    目标目录)中的
    completesite
    目录中。

    您将在github页面的上下文中找到详细的分析和示例。另见

    有什么工作要做?

    • <distributionManagement>
        <site>
          <id>mysite</id>
          <name>My Site</name>
          <url>ftp://server.example.com/htdocs/site/two/</url>
        </site>
      </distributionManagement>
      
      mvn -DstagingDirectory=D:/Temp/Site package site site:stage
      
      mvn clean site site:stage 
      
      extraParent     // parent not part of this multi-module build
      foo
        pom.xml       // aggregator
        fooParent     // parent for this project
        module1       // inherits from fooParent
        extraModule   // inherits from extraParent
      
      <properties>
        <foo.site.url>file://somePath/foo/${project.artifactId}</foo.site.url>
      </properties>
      
      <url>${foo.site.url}</url>
      <distributionManagement>
          <site>
              <id>site-docs</id>
              <url>${foo.site.url}</url>
          </site>
      </distributionManagement>
      
      <properties>
        <topSiteURL>file://somePath/foo/</topSiteURL>
        <foo.site.url>${topSiteURL}/${project.artifactId}</foo.site.url>
      </properties>
      
      <url>${foo.site.url}</url>
      <distributionManagement>
          <site>
              <id>site-docs</id>
              <url>${foo.site.url}</url>
          </site>
      </distributionManagement>
      
      <distributionManagement>
          <site>
              <id>internal.repo</id>
              <name>Temporary Staging Repository</name>
              <url>file://${project.build.directory}/mvn-repo</url>
          </site>
      </distributionManagement>
      
      mvn site
      
      mvn site:stage
      
      <distributionManagement>
        <site>
          <id>website</id>
          <url>file://${project.build.directory}/completesite</url>
        </site>
      </distributionManagement> 
      
      ./mvnw clean site site:stage