Связывание с javadoc.io с использованием опции Javadoc -link

Я пытаюсь связать некоторые Javadocs, размещенные в javadoc.io(в частности, PowerMock 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/ не работает.

Ответ 1

В командной строке используйте аргумент типа -J-Dhttp.agent=javadoc.

В Maven используйте что-то вроде:

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

Фон: как Данило Пианини предлагает в еще один ответ, проблема заключается в заголовке 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 из URL javadoc.io (это необычная вещь), он может выйти из строя. Проблема: 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 - это хорошо:))

Ответ 2

Я исследовал проблему, проблема в том, что пользовательский агент должен быть установлен (пустая строка в порядке), чтобы соединение с javadoc.io завершилось успешно.

Я работал над проблемой и писал плагин Gradle, который может быть полезен для тех, кто полагается на эту систему сборки.

К сожалению, работа вокруг не может быть перенесена на обычный вызов команды javadoc -link.

Ответ 3

Странно: я мог видеть в браузере, например. 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

Я использую следующее обходное решение:

  • С maven-dependency-plugin распаковать javadoc желаемой зависимости.
  • Свяжите его с опцией 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>
    

Ответ 4

В итоге я использовал -linkoffline, чтобы обойти эту проблему, которая, как я полагаю, обладает хорошим свойством не нуждаться в подключении к Интернету во время сборки, хотя если кто-нибудь еще подумает о том, как сделать эту работу с -link я Все уши.