【问题标题】:Maven javadoc Search redirects to "/undefined/.." urlMaven javadoc 搜索重定向到“/undefined/..” url
【发布时间】:2019-02-18 22:23:50
【问题描述】:

我已经使用 javadoc maven 插件 3.0.1 和 Java 9 生成了 javadoc。但是,当我使用新的搜索功能并选择一个类时,它会重定向到“找不到文件”...

网址中有undefined(例如“../target/site/apidocs/undefined/com/mycompany/MyClass.html”),如果将其删除,则可以正确加载页面。

能否请您帮助我正确配置以生成 java doc(摆脱这个 undefined),以便搜索功能可以正常加载 html 页面?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>${version.maven-javadoc-plugin}</version>
        <executions>
            <execution>
                <id>javadoc</id>
                <goals>
                    <goal>javadoc</goal>
                </goals>
                <phase>prepare-package</phase>
                <configuration>
                    <doclint>none</doclint>
                    <dependencySourceIncludes>
                       <dependencySourceInclude>com.some:some</dependencySourceInclude>
                    </dependencySourceIncludes>
                    <doctitle>Title - ${project.version}</doctitle>
                    <includeDependencySources>true</includeDependencySources>
                    <windowtitle>Title</windowtitle>
                </configuration>
            </execution>
        </executions>

【问题讨论】:

  • 请发布您的 javadoc maven 插件配置
  • 附在原帖上。谢谢。
  • 刚刚发现getURLPrefix(ui) 中的useModuleDirectories search.js 正在控制它。现在的问题是如何在生成阶段摆脱它们或将其设​​置为错误值?

标签: java maven search javadoc doc


【解决方案1】:

在 java doc maven 插件配置中的以下选项的帮助下完成了这项工作

<additionalJOption>--no-module-directories</additionalJOption>

【讨论】:

  • 你知道这是否是javadoc的一个错误,因为我们应该被允许有一个未命名的模块吗?
  • 不能说,我猜默认行为是期望项目具有模块结构,因为新的拼图功能。可能是 javadoc 可执行文件(或 maven 插件)应该检测结构并在某种程度上保持一致/向后兼容。
  • 如果您只使用 Eclipse,您可以将其添加到 Extra Javadoc 选项中,例如:“--no-module-directories”
  • 我可以确认这是可行的,但是这个选项在 JDK13 中消失了...bugs.java.com/bugdatabase/view_bug.do?bug_id=8215580
  • 你不应该在 jdk13 中需要它,因为这在 jdk12 中已修复(正如有人在此处的答案之一中提到的那样)。
【解决方案2】:

这有点小技巧,但正如@Martin Goikhis answer 中提到的那样,由于缺少模块名称,指定--no-module-directories 会破坏任何指向标准类的外部链接。正如 OP 在评论中提到的那样,search.jsgetURLPrefix(ui) 是生成模块名称的原因。所以经过一番挖掘,我发现问题可以通过将其附加到search.js的末尾来解决:

getURLPrefix = function(ui) {
    return "";
};

它本质上覆盖了getURLPrefix 的定义,无论如何都返回一个空字符串。由于它只需要附加到文件的末尾,因此应该很容易通过代码或命令使用任何构建工具进行自动化。

例如,如果您使用的是 Gradle,则可以将以下内容添加到 build.gradle

// Needed to fix Javadoc search
// See comments below
final JAVADOC_FIX_SEARCH_STR = '\n\n' +
'getURLPrefix = function(ui) {\n' +
'    return \'\';\n' +
'};\n'

tasks.withType(Javadoc) {
    // Link to external docs
    options.with {
        // Example: Java 11 API documentation
        links 'https://docs.oracle.com/en/java/javase/11/docs/api/'
    }

    doLast {
        // Append the fix to the file
        def searchScript = new File(destinationDir.getAbsolutePath() + '/search.js')
        searchScript.append JAVADOC_FIX_SEARCH_STR
    }
}

【讨论】:

【解决方案3】:

Javadoc 生成的每个.html 文件都包含以下变量定义:

var useModuleDirectories = true;

这会影响search.jsgetURLPrefix() 函数的行为:

function getURLPrefix(ui) {
    var urlPrefix="";
    if (useModuleDirectories) {
        ...
    }
    return urlPrefix;
}


因此,我们可以通过用false 覆盖useModuleDirectories 的值来解决此问题,这可以通过在-bottom 选项中指定以下脚本标记来实现:

<script>
if (typeof useModuleDirectories !== 'undefined') {
  useModuleDirectories = false;
}
</script>

请注意,您还必须指定--allow-script-in-comments 选项,以便Javadoc 不会抱怨在cmets 中使用&lt;script/&gt; 标记。


使用 Javadoc maven 插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>${javadoc.pluginVersion}</version>
    <executions>
        <execution>
            <id>javadoc</id>
            <goals>
                <goal>javadoc-no-fork</goal>
                <goal>jar</goal>
            </goals>
            <phase>process-resources</phase>
            <configuration>
                <bottom>
                <![CDATA[
                    <script>
                    if (typeof useModuleDirectories !== 'undefined') {
                      useModuleDirectories = false;
                    }
                    </script>
                ]]>
                </bottom>
                <additionalJOption>--allow-script-in-comments</additionalJOption>

【讨论】:

    【解决方案4】:

    这个错误应该在 JDK 12 中修复:https://bugs.openjdk.java.net/browse/JDK-8215291

    感谢 Chris Povirk 查找相关错误报告。

    【讨论】:

      【解决方案5】:

      这确实解决了链接到 ../undefined/... 的 «Search» 问题。然而,有一个讨厌的副作用:指向标准类或接口的链接,例如https://docs.oracle.com/en/java/javase/12/docs/api/... 将因缺少模块名称而损坏。

      考虑例如指向java.lang.String 的链接现在错误地指向https://docs.oracle.com/en/java/javase/12/docs/api/java/lang/String.html,而不是指向https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/String.html

      【讨论】:

      【解决方案6】:

      添加 &lt;additionalJOption&gt;-no-module-directories&lt;/additionalJOption&gt;

      为我工作。有一个- 而不是--

      【讨论】:

        猜你喜欢
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-07-26
        • 2013-07-09
        • 1970-01-01
        • 2014-03-13
        • 2019-02-02
        • 1970-01-01
        相关资源
        最近更新 更多