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


我试图链接到javadoc.io(特别是PowerMock的Javadocs)托管的一些Javadocs使用 @link 选项。我曾尝试将URL添加到PowerMock的Javadocs中 -link 标志,但无法让Javadoc识别它。我正在使用外部链接到其他Javadocs(例如Guava,Java SE 7)和Gradle作为我的构建系统。我尝试了以下选项:

-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/ 不起作用。


3152
2017-11-23 08:09


起源

也许用javadoc运行 -verbose 选项会给出一个暗示,什么是错的。 - hinneLinks
不幸的是我还没有得到任何东西 [ERROR] [system.err] javadoc: warning - Error fetching URL: http://static.javadoc.io/org.powermock/powermock-core/1.6.3/ - krog
访问这些网址(static.javadoc.io 浏览器中的版本)导致访问被拒绝错误。 Javadoc可能有相同的结果。 - erickson
Javadoc实际上是否尝试访问基本URL?你可以访问 包列表文件, 包摘要,和 类文件 正好。 - krog
我也通过电子邮件发送了javadoc.io联系人,只是希望有人在这里有经验,因为(AFAIK)javadoc.io非常标准。 - krog


答案:


从命令行,使用类似的参数 -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。它也适用 -linkoffline 如果你下载了 package-list 文件并告诉Javadoc从磁盘读取它。但是,如果你使用 -linkoffline 但要告诉Javadoc package-list 来自 javadoc.io URL(这是一件不寻常的事情), 它可能会失败。问题:Maven试图预先验证 package-list 文件,但在某些版本的Java下,失败,因为它拒绝SSL证书 javadoc.io,Javadoc自己接受的证书。)

(哦,具体使用URL似乎很重要 static.javadoc.io不是 javadoc.io。另外,我会建议 https不是 http, 以防万一 http://static.javadoc.io 有一天会开始向重定向发布 https://static.javadoc.io,作为Javadoc 目前不处理此类重定向。也, https 是一件好事:))


4
2017-12-19 16:39



很棒的解释和解决方案,谢谢! - krog


我已经调查了这个问题,这里的问题是必须设置用户代理(空字符串没问题)才能成功连接到javadoc.io。

我解决了这个问题并写道 一个可能有帮助的Gradle插件 对于那些依赖于构建系统的人。

不幸的是,周围的工作无法移植到常规 javadoc -link 命令调用。


4
2017-11-09 18:22



棒极了! Danilo,伟大的工作找出根本原因并解决它。 - krog
谢谢!顺便说一句,我忘记了 不 在最后一句:解决方法可以 不 get ported到常规命令行调用。 - Danilo Pianini
我通过设置Java用于的系统属性来使用默认插件 User-Agent 在...上 javadoc 处理。请注意,这仅适用于 -link不是 -linkoffline,正如Maven预先验证的那样 -linkoffline  package-list 文件和 javadoc.io 似乎在拒绝 Maven的 请求 - 虽然看似基于更多的东西 User-Agent 检查它是否用于拒绝 javadoc 本身。无论如何,神奇的是 <additionalJOption>-J-Dhttp.agent=maven-javadoc-plugin-${pom.name}</additionalJOption> (或您想要使用的任何代理字符串)。 - Chris Povirk
另外,我应该注意到我没有 认为  javadoc.io 是故意阻止 javadoc -link。 这个Eclipse的bug 建议阻止 Java/* 用户代理是某些内容传送网络的默认行为 javadoc.io 和 javadoc 只是意外受到影响。也许 javadoc 本身应该设置一个 User-Agent.... - Chris Povirk


这很奇怪:我可以在浏览器中看到,例如 http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list但是当我补充说 http://static.javadoc.io/org.pegdown/pegdown/1.6.0 作为javadoc的 link 选择它说

获取URL时出错: http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list

我使用下一个解决方法:

  1. maven-dependency-plugin unapack所需依赖的javadoc。
  2. 链接它 linkoffline 选项。

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

3
2018-06-08 12:25





我结束了只是使用 -linkoffline 解决这个问题,我认为它具有在构建时不需要互联网连接的良好特性,但是如果有人对如何使用这个问题有进一步的想法 -link 我全都听见了。


2
2017-11-24 01:23