19

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

我有一个包含所有子模块的聚合 POM,一个包含子模块所有通用功能的继承 POM,以及 20 个左右的子模块。

我已经浏览了无数的在线示例,以了解如何使其发挥作用。在这些中没有一个是这项工作的多模块部分。我可以在子级(和聚合模块)的目标/站点文件夹中构建好的单个站点输出。我还将它暂存到聚合 POM 中的目标/暂存文件夹中。创建的东西看起来不错。

但:

子模块链接都不起作用。

我试过在码头下运行它,因为关于这个问题的一些评论说这些链接只有在它被构建为一个网站时才有效——但不,同样的问题,它找不到孩子的 index.html。

有没有有这个工作的例子?并且为了避免我撕掉更多的头发(上帝知道它已经用完了),我宁愿看到实际工作的 POM 代码和/或正确测试和部署所遵循的阶段。

任何人都可以帮忙吗?

4

9 回答 9

14

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

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

mvn clean site site:stage 

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

于 2013-10-12T16:25:22.083 回答
10

OK,终于搞定了。

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-site-plugin</artifactId>
    <version>3.0</version>
    <configuration>
     <stagingDirectory>C:\temp\stage</stagingDirectory>
     <reportPlugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-project-info-reports-plugin</artifactId>
         <version>2.4</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <version>2.8</version>
         <configuration></configuration>
         <reportSets>
           <reportSet>
             <id>non-aggregate</id>
             <configuration>
               <!-- Specific configuration for the aggregate report -->
               <sourcepath>${project.build.sourceDirectory}/../generated</sourcepath>
             </configuration>
             <reports>
               <report>javadoc</report>
             </reports>
           </reportSet>
           <reportSet>
             <id>aggregate</id>
             <configuration>
               <!-- Specific configuration for the aggregate report -->
               <sourcepath>${project.build.sourceDirectory}/../generated</sourcepath>
             </configuration>
             <reports>
               <report>aggregate</report>
             </reports>
           </reportSet>
         </reportSets>
       </plugin>
        <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-report-plugin</artifactId>
         <version>2.6</version>
       </plugin>
     </reportPlugins>
    </configuration>
</plugin>

将此添加到父级的分发管理部分:

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

然后运行

mvn site site:stage

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

于 2012-06-06T12:49:37.347 回答
6

距离上一个解决方案已经一年多了。

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

所以这里是:

在 Maven 站点插件常见问题解答中: http ://maven.apache.org/plugins/maven-site-plugin/faq.html#Use_of_url

“另一方面,在多模块构建中用于构建相对链接 [...]。在多模块构建中,父模块和子模块具有不同的 URL 很重要。”

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

父 POM:

<distributionManagement>
  <site>
    <id>mysite</id>
    <name>My Site</name>
    <url>ftp://server.example.com/htdocs/site/</url>
  </site>
</distributionManagement>

孩子一 POM:

<distributionManagement>
  <site>
    <id>mysite</id>
    <name>My Site</name>
    <url>ftp://server.example.com/htdocs/site/one/</url>
  </site>
</distributionManagement>

孩子两个 POM:

<distributionManagement>
  <site>
    <id>mysite</id>
    <name>My Site</name>
    <url>ftp://server.example.com/htdocs/site/two/</url>
  </site>
</distributionManagement>

现在该站点的生成和分期工作按要求进行。暂存站点生成于parent/target/staging

您可以使用 -D 提交另一个暂存目录

mvn -DstagingDirectory=D:/Temp/Site package site site:stage

注意:如果子 2 有子 1 作为依赖项,则需要目标包。使用package,执行目标站点时不会出现存储库中缺少依赖项的错误。

编辑:有必要为每个使用与 <distributionManagement> 中相同的路径的工件提供一个 <url>。这是因为report-info-plugin 生成的index.html 使用<url> 来计算相对路径,而site:stage 使用<distributionManagement>。

于 2013-09-26T12:48:51.283 回答
4

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

于 2012-06-01T10:43:02.020 回答
3

这并不完全按照您的想法工作。这在我运行“mvn 站点”时为什么父模块和子模块之间的链接不起作用?常问问题。

我不是 Maven 专家,但这就是我在本地生成网站的方式:

  1. <site>在根 POM 中 配置 a

    <distributionManagement>
        <site>
            <id>internal.repo</id>
            <name>Temporary Staging Repository</name>
            <url>file://${project.build.directory}/mvn-repo</url>
        </site>
    </distributionManagement>
    
  2. 为您的项目构建站点

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

    mvn site:stage
    
  4. 默认情况下,站点将在${project.build.directory}/staging目录下生成

于 2015-09-11T19:19:28.357 回答
3

给迷路的一些指点。运行后mvn site site:stage目录site将不包含组合站点,该站点将在staging目录中。根据maven 站点插件使用页面,在站点部署之前不会完成组合。暂存后,您可以调用mvn site:deploy将组合站点复制到您在 distributionManagement 中定义的 url 中指定的位置

<distributionManagement>
  <site>
    <id>website</id>
    <url>file://${project.build.directory}/completesite</url>
  </site>
</distributionManagement> 

在这种情况下,完成的站点最终将位于completesite项目构建目录(通常是target目录)中的目录中。

于 2016-04-06T08:41:04.817 回答
1

我有一个与 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

@Stefan 的回答是朝着正确方向迈出的一大步。特别是,我确认子模块必须重复distributionManagementandurl元素。我在 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>

Maven 分别计算foo.site.url了 fooParent 和 module1:file://somePath/foo/fooParent和的正确值file://somePath/foo/module1。然而,顶级站点不包含到 module1 的正确链接,除非完全相同的 url/distributionManagement 块在子级中重复。似乎站点生成正在检查继承的配置而不考虑实际的 URL 值(即使它们在我查看有效 POM 时描述的情况下有所不同)。我发现这非常不直观。

我还需要一个配置元素来让顶级站点正确链接到 extraModule topSiteURL:. 我在 extraModule 的 POM 中添加了以下内容。注意我只是将 URL 的基本部分(包括顶级目录)提取到topSiteURL值中,然后在foo.site.url属性中使用它。

<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>

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

于 2015-01-30T00:46:01.460 回答
0

http://wiki.bitplan.com/index.php/Multi-Module_Maven_with_github_pages,您会在 github-pages 的上下文中找到详细的分析和示例。另请参阅将 mvn site-deploy 与 github 页面一起使用的多模块示例

解决方法是什么?

  • 不要使用插件!
  • git clone 或将 gh-pages 拉到本地文件夹
  • mvn site:stage 到临时登台目录
  • rsync 将结果同步到 git 本地文件夹中
  • 签入本地文件夹
  • 喝杯咖啡或喝杯啤酒/开心

    不要使用插件!

  • 它很慢(因为真的很慢......示例项目需要 18 分钟)

  • 它不可靠(如 500 HTML 代码)

  • 它维护得不好(如 [ https://github.com/github/maven-plugins/issues 57 open issues as of 2018-08]

  • 它是多余的(见下文)即使是提交者也不再使用它(就像我今天收到的个人邮件一样..)
#
# createSite
#   ws: global variable pointing to workspace 
#   param 1: l_project - project name/directory
#   param 2: l_ghpages - directory where gh-pages branch has been git cloned/pulled
#   param 3: l_modules - non-empty for a multi-module project (e.g. containing the list of modules)
#
createSite() {
  local l_project="$1"
  local l_ghpages="$2"
  local l_modules="$3"

  color_msg $green "creating site for $l_project $l_modules"
  cd $ws/$l_project
    stage=/tmp/stage$$
    sitelog=/tmp/sitelog$$.txt
    rm -rf $stage
    # the stagingDirectory needs to be subdirectory 
    mkdir -p $stage/$l_project

    # run the staging of the site against this directory and log the results
    mvn -U clean install site site:stage -DstagingDirectory=$stage/$l_project | tee $sitelog

    # rsync the result into the github-pages folder
    rsync -avz --del $stage/* $l_ghpages/$l_project/

    # is this a multi module project?
    if [ "$l_modules" != "" ]
    then
        cd $l_ghpages/$l_project/
        if [ ! -f index.html ]
        then
cat << EOF > index.html
<!DOCTYPE html>
<html>
<head>
   <!-- HTML meta refresh URL redirection -->
   <meta http-equiv="refresh"
   content="0; url=./$l_project/$l_project/index.html">
</head>
<body>
   <p>This is a multimodule mvn site click below to get to the index.html of 
   <a href="./$l_project/$l_project/index.html">$l_project</a></p>
</body>
</html> 
EOF
        fi
        # add potentially new files
        git add *
        # commit results
        git commit -m "checked in by checksite script"
        # push results
        git push
    fi
    if [ "$debug" = "false" ]
    then
      rm -rf $stage
        rm $sitelog
    fi
}
于 2018-08-24T12:21:14.310 回答
0

我的案例将以下部分添加到顶部 pom 解决了问题:

<distributionManagement>
  <site>
    <id>struts-site</id>
    <url>https://struts.apache.org/maven/</url>
  </site>
</distributionManagement>

现在使用下面的命令,它将在下面生成整个页面target/staging

./mvnw clean site site:stage

我正在使用这样的插件配置:

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.9.0</version>
<configuration>
  <relativizeDecorationLinks>false</relativizeDecorationLinks>
</configuration>

请注意,您还必须site.xml为每个子模块定义,因为菜单不是继承的。

于 2020-04-20T05:16:37.120 回答