使用Javadoc -link选项链接到javadoc.io

14
我试图使用@link选项链接到托管在javadoc.io上的一些Javadocs(具体而言是PowerMock的Javadocs)。我尝试将PowerMock的Javadocs的URL添加到我的-link标志中,但无法使Javadoc识别它。我正在使用Gradle作为构建系统,并已经成功地使用外部链接到其他Javadocs(例如Guava,Java SE 7)。我尝试了以下选项: -link http://static.javadoc.io/org.powermock/powermock-core/1.6.3/ ^ 我已确认此目录中存在一个package-list文件 -link http://static.javadoc.io/org.powermock/powermock-core/ -link http://javadoc.io/doc/org.powermock/powermock-core/1.6.3/ -link http://javadoc.io/doc/org.powermock/powermock-core/ 所有这些都会导致以下错误(相应地更改URL): javadoc: warning - Error fetching URL: http://static.javadoc.io/org.powermock/powermock-core/1.6.3/ 有人有如何使其工作的建议吗? 据我所知,这是某种javadoc.io特定的问题,但可能是在我这边的用法问题--例如,我目前正在使用-link http://junit.org/javadoc/latest/,没有问题,但-link http://static.javadoc.io/junit/junit/4.12/不起作用。

1
也许使用“-verbose”选项运行javadoc会给出一些提示,看看哪里出了问题。 - hinneLinks
1
很不幸,我仍然没有得到除以下内容之外的任何信息:[ERROR] [system.err] javadoc: warning - Error fetching URL: http://static.javadoc.io/org.powermock/powermock-core/1.6.3/ - xkrogen
1
在浏览器中访问这些URL(static.javadoc.io版本)会导致访问被拒绝的错误。Javadoc可能会有相同的结果。 - erickson
1
Javadoc实际上是否尝试访问基本URL?您可以正常访问包列表文件,包摘要和类文件。 - xkrogen
1
我也已经给javadoc.io的联系人发送了电子邮件,只是希望这里有人有经验,因为(据我所知)javadoc.io是非常标准的。 - xkrogen
5个回答

8

从命令行使用类似于-J-Dhttp.agent=javadoc的参数。

在Maven中,使用类似于以下内容的参数:

<additionalJOption>-J-Dhttp.agent=maven-javadoc-plugin-${pom‌​.name}</additionalJO‌​ption>

背景:正如Danilo Pianini在另一个答案中所建议的那样,问题在于“User-Agent”头。然而,问题不是一个的“User-Agent”; 它是默认的Java“User-Agent”, 看起来像“Java/1.8.0_112”:
$ URL=https://static.javadoc.io/org.checkerframework/checker-qual/2.2.2/package-list

# default Java User-Agent:
$ wget -U Java/1.8.0_112 "$URL" 2>&1 | grep response
HTTP request sent, awaiting response... 403 Forbidden

# no User-Agent:
$ wget -U '' "$URL" 2>&1 | grep response
HTTP request sent, awaiting response... 200 OK

# custom User-Agent:
$ wget -U javadoc "$URL" 2>&1 | grep response
HTTP request sent, awaiting response... 200 OK

因此,解决方法是告诉Javadoc使用不同的 User-Agent。Java不允许您省略 User-Agent,因此您必须提供一个值,Java将在其默认代理之前添加该值。
据我所知,阻止Javadoc并非有意为之:Javadoc只是(可能是不明智的)使用默认的Java User-Agent,而javadoc.io使用的内容交付网络默认阻止了它。
(关于Maven的另一个注意事项:使用 -link 一切正常。如果您下载了 package-list 文件并告诉Javadoc从磁盘读取它,那么使用 -linkoffline 也可以正常工作。但是,如果您使用 -linkoffline,但告诉Javadoc从 javadoc.io URL 获取 package-list(这是一件不寻常的事情),可能会失败it may fail。问题在于:Maven尝试预验证 package-list 文件,但在某些Java版本下失败,因为它拒绝了javadoc.io的SSL证书,而Javadoc本身接受了该证书。)
(哦,似乎很重要使用来自 static.javadoc.io 的 URL,而不是 javadoc.io。此外,我建议使用 https,以防万一 http://static.javadoc.io 某天开始发出重定向到 https://static.javadoc.io,因为 Javadoc 目前无法处理此类重定向。此外,https 是一个好东西 :)))

一个快速的提示,设置 javadoc 使用 User-Agent 的机制在 JDK 11 中不再起作用。我不确定为什么,但我猜测 javadoc 可能不再使用 java.net.* 类。 - Laird Nelson
轻微相关的错误:https://bugs.openjdk.java.net/browse/JDK-8184969,https://bugs.openjdk.java.net/browse/JDK-8190312 - Laird Nelson
对于Gradle 5,您需要:options.jFlags('-Dhttp.agent = gradle-javadoc')(单引号在某种程度上很重要...) - ST-DDT

5
奇怪的是:我可以在浏览器中看到例如http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list,但当我将http://static.javadoc.io/org.pegdown/pegdown/1.6.0添加为javadoc的选项时,它会显示以下错误信息:

Error fetching URL: http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list

我使用下面的解决方法:
  1. With maven-dependency-plugin unapack the javadoc of desired dependency.
  2. Link it with linkoffline option.

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.8</version>
        <executions>
            <execution>
                <id>unpack-javadoc</id>
                <phase>package</phase>
                <goals>
                    <goal>unpack</goal>
                </goals>
                <configuration>
                    <artifactItems>
                        <artifactItem>
                            <groupId>org.pegdown</groupId>
                            <artifactId>pegdown</artifactId>
                            <classifier>javadoc</classifier>
                            <version>${pegdownVersion}</version>
                            <overWrite>false</overWrite>
                            <outputDirectory>${project.build.directory}/pegdown-javadoc</outputDirectory>
                        </artifactItem>
                    </artifactItems>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
            <links>
                <link>http://www.slf4j.org/apidocs/</link>
            </links>
            <offlineLinks>
                <offlineLink>
                    <url>http://static.javadoc.io/org.pegdown/pegdown/${pegdownVersion}</url>
                    <location>${project.build.directory}/pegdown-javadoc</location>
                </offlineLink>
            </offlineLinks>
        </configuration>
    </plugin>
    

4
我已经调查了这个问题,问题在于必须设置用户代理才能成功连接 javadoc.io(空字符串也可以)。
我解决了这个问题,并编写了一个 Gradle 插件可能对那些依赖该构建系统的人有所帮助
不幸的是,这个解决方法无法移植到常规的 javadoc -link 命令调用中。

1
太棒了!干得好,Danilo,找出了根本原因并解决了它。 - xkrogen
顺便提一下,我在最后一句话中忘了加一个“不”:这个解决方法无法移植到常规命令行调用。谢谢! - Danilo Pianini
1
我通过设置Java在javadoc进程上使用的User-Agent系统属性,使默认插件正常工作。请注意,这仅适用于-link,而不是-linkoffline,因为Maven预验证-linkoffline package-list文件,并且javadoc.io似乎也拒绝_Maven_的请求--尽管似乎基于比其用于拒绝javadoc本身的User-Agent检查更多的东西。无论如何,魔法是<additionalJOption>-J-Dhttp.agent=maven-javadoc-plugin-${pom.name}</additionalJOption>(或者您想要使用的任何代理字符串)。 - Chris Povirk
另外,我应该指出,我不认为 javadoc.io 有意地阻止 javadoc -link这个 Eclipse bug 表明,阻止 Java/* 用户代理是某些内容交付网络的默认行为,而 javadoc.iojavadoc 只是无意中受到影响。也许 javadoc 本身应该设置一个 User-Agent.... - Chris Povirk

2

我最终只使用了-linkoffline来解决这个问题,我认为这种方法的好处是在构建时不需要网络连接,但如果有人对如何使用-link进行进一步的思考,我很乐意听取意见。


2
我正在运行javadoc.io。
这被报告为github问题,现在已经解决了。不再需要覆盖用户代理字符串。
如果仍然存在问题,请随时重新打开github问题。此线程不会被积极监视。
curl -I -A "Java/1.6.0_14" https://static.javadoc.io/org.checkerframework/checker-qual/2.2.2/package-list
HTTP/1.1 200 OK
Date: Mon, 08 Apr 2019 13:06:04 GMT
Content-Type: text/plain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接