【问题标题】:Maven and JavaDoc: install additional (generated) filesMaven 和 JavaDoc:安装附加(生成)文件
【发布时间】:2014-12-22 01:00:40
【问题描述】:

我的项目可以从源代码自动生成一些额外的帮助文件。

如何让 maven 将这些文件安装到生成的 JavaDoc 包中?

我不知道如何使用 Maven:

  1. 运行一些类来生成附加文档,例如编译并启动 src/main/java/mypackage/ListOptions.java aka mypackage.ListOptions 以生成所有可用选项/模块/示例/等的列表。 .

  2. 安装输出文件(我只能让 Maven 将文件从 src/main/javadoc/resources 安装到 site/apidocs/resources 子文件夹中;但我希望此文档位于顶级 site/apidocs 文件夹中;更准确地说,我不'根本不关心site 部分,而是关心mypackage-0.1.0-SNAPSHOT-javadoc.jar 中的完整文档;包括从javadoc 链接的非Javadoc 生成的辅助信息)。

最小示例 - maven 的插件配置:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9.1</version>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <docfilessubdirs>true</docfilessubdirs>
            </configuration>
        </plugin>

目录布局:

./pom.xml
./src/main/java/foobar/GenerateNonstatic.java
./src/main/javadoc/staticfile.js
./src/main/javadoc/resources/insubfolder.png

mvn package 生成:./target/apidocs./target/foobar-0.0.1-SNAPSHOT-javadoc.jar 中的 javadoc。文件target/apidocs/resources/insubfolder.png 最终位于文件夹target/apidocs/resources(和.jar)中,但未安装staticfile.js

我不清楚如何运行 GenerateNonstatic.java 以将输出包含在 javadoc .jar 中。我没有看到让 exec:exec 它运行 after javadoc 的钩子,并且 before ./target/foobar-0.0.1-SNAPSHOT-javadoc.jar 已构建...

【问题讨论】:

  • 请显示您的 pom.xml 文件和目录结构,显示文档生成类的位置和所需的输出位置。
  • 文档生成类在 Java 源代码中,src/main/java(你不会在 pom.xml 中看到它,因为我不清楚如何配置 exec 任务所以它最终在 javadoc 中...),所需的输出位置是 whatever packagejavadoc 魔术用于构建 ...-javadoc.jar 包。
  • @333kenshin 我添加了一个最小的示例,但我不明白这会有什么帮助。

标签: java maven javadoc


【解决方案1】:

埃里克,

如果您不喜欢修改 javadoc 可执行文件,另一种选择是将您的 javadoc 调用分解为 2 个单独的步骤(javadoc 和 jar),并通过 &lt;phase&gt; 标签操纵 Maven 构建生命周期在它们之间进行调用:

  • 阶段:生成源 => maven-javadoc-plugin:javadoc
  • 阶段:编译 => exec-maven-plugin:java
  • 阶段:包 => maven-javadoc-plugin:jar

注意:使用 exec:java,而不是 exec:exec 来运行 java 类

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.9.1</version>
        <executions>
            <execution>
                <id>generate-javadocs</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>javadoc</goal>
                </goals>
            </execution>
            <execution>
                <id>attach-javadocs</id>
                <phase>package</phase>
                <goals>
                    <goal>jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.3.2</version>
        <executions>
            <execution>
                <id>generate-nonstatic-javadocs</id>
                <phase>compile</phase>
                <goals>
                    <goal>java</goal>
                </goals>
                <configuration>
                    <mainClass>foobar.GenerateNonstatic</mainClass>
                </configuration>
            </execution>
       </executions>
    </plugin>

【讨论】:

  • 注意:exec:java 显然不支持多次执行。由于我运行了两个生成器,因此我需要使用exec:exec。非常感谢您的帮助!
  • 还不完全有效。似乎第一个目标将运行 javadoc,进入报告文件夹。第二个将运行 javadoc 再次,进入target/apidocs 文件夹。我通过为第一次运行设置报告目录并在第二次运行时使用/bin/true 作为“javadoc 可执行文件”来“破解”它。这会导致警告,但构建工作。但我现在选择了一个更简单的解决方案。
【解决方案2】:

长话短说。 javadoc:javadocjavadoc:jar mojos 都有其缺点。第一个是构建用于报告的 javadoc;后者将构建 javadoc(到不同的目录)并生成一个 jar 包。

因此,一些建议的答案效果不佳 - 他们会执行 javadoc 两次。

但我注意到 javadoc 并不关心文件夹是否已经存在或包含文件

所以我的解决方案很简单:在prepare-package 中生成所需的附加文件,常规的javadoc:jar 任务添加常规的javadoc 并很好地打包它。

只要您不打算修改 javadoc 生成的文件(幸运的是,我不这样做 - 我只是添加额外的文档。

生成的pom.xml 是这样的:

<plugins>
    <!-- copy additional javadoc resources -->
    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>
        <execution>
            <id>copy-resources</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
        <outputDirectory>${project.build.directory}/apidocs</outputDirectory>
            <resources>
            <resource>
                <directory>${basedir}/src/main/javadoc</directory>
                <excludes>
                <!-- overview.html is integrated by javadoc -->
                <exclude>${basedir}/src/main/javadoc/overview.html</exclude>
                </excludes>
            </resource>
            </resources>
            </configuration>
        </execution>
        </executions>
    </plugin>
    <!-- Generate additional files for javadoc -->
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.3.2</version>
        <executions>
            <execution>
                <id>generate-extra-javadoc</id>
                <phase>prepare-package</phase>
                <goals>
                       <!-- java is okay, but you only can have one -->
                    <goal>exec</goal>
                </goals>
                <configuration>...</configuration>
            </execution>
        </executions>
    </plugin>
    <!-- Build JavaDoc -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.10.1</version>
        <executions>
            <execution>
                <id>attach-javadocs</id>
                <phase>package</phase>
                <goals>
                    <goal>jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

【讨论】:

  • 我现在使用 Gradle。 Maven一旦变得复杂就太烦人了。
【解决方案3】:

回答您的第一个问题:使用 Exec-Maven-Plugin 运行命令行命令或使用 Maven-Ant-Plugin 并嵌入自定义任务。

【讨论】:

    【解决方案4】:

    埃里克,

    你的例子确实很有帮助。请务必在提问时尽可能多地提供具体示例。

    最简单的方法是编写自己的Alternate Javadoc tool 并通过&lt;javadocExecutable&gt; 标签将其传递给Maven。这个例子来自上面的链接:

    <project>
      ...
      <reporting> (or <build>)
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.10.1</version>
            <configuration>
              <javadocExecutable>C:\jdk1.6.0\bin\javadoc.exe</javadocExecutable>
              ...
            </configuration>
          </plugin>
          ...
        </plugins>
      </reporting> (or </build>)
      ...
    </project>
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 2012-04-15
      • 2016-07-01
      • 2019-10-27
      • 1970-01-01
      • 2013-03-14
      • 2016-10-04
      • 2011-06-07
      相关资源
      最近更新 更多