2015-11-23 11 views
10

Próbuję połączyć się z niektórymi Javadocs hostowanymi w javadoc.io (konkretnie Javadocs PowerMocka) przy użyciu opcji @link. Próbowałem dodać adres URL do Javadocs PowerMocka do mojej flagi -link, ale nie mogę dostać Javadoc, aby ją rozpoznać. Używam zewnętrznych linków do innych Javadocsów w porządku (np. Guava, Java SE 7) z Gradle jako moim systemem kompilacji. Próbowałem następujące opcje:Łączenie z javadoc.io przy użyciu opcji Javadoc -link

-link http://static.javadoc.io/org.powermock/powermock-core/1.6.3/

^I potwierdziły, że jest to plik w katalogu

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

Cała package-list to powoduje następujący błąd R (URL odpowiednio zmienione):

javadoc: warning - Error fetching URL: http://static.javadoc.io/org.powermock/powermock-core/1.6.3/

Czy ktoś ma informacje o tym, jak do tej pracy?

O ile mogę powiedzieć, jest to jakiś specyficzny problem z javadoc.io, ale prawdopodobnie problem z używaniem na moim końcu - na przykład obecnie używam -link http://junit.org/javadoc/latest/ bez problemu, ale -link http://static.javadoc.io/junit/junit/4.12/ nie działa.

+1

Może uruchomienie javadoc z opcją '-verbose' da wskazówkę, co jest nie tak. – hinneLinks

+1

Niestety nadal nie mam nic poza: '[ERROR] [system.err] javadoc: warning - Błąd podczas pobierania adresu URL: http: // static.javadoc.io/org.powermock/powermock-core/1.6.3 /' – krog

+1

Uzyskiwanie dostępu do tych adresów URL (wersje 'static.javadoc.io') w przeglądarce powoduje błąd odmowy dostępu. Javadoc prawdopodobnie ma taki sam wynik. – erickson

Odpowiedz

2

Z wiersza poleceń użyj argumentu takiego jak -J-Dhttp.agent=javadoc.

W Maven używać coś takiego:

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

tle: Jak Danilo Pianini sugeruje w another answer, problem jest nagłówek User-Agent. Jednak problem nie jest pusty i nie jest pusty; it's the default Java User-Agent, który wygląda mniej więcej tak: „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 

Więc poprawka jest powiedzieć Javadoc użyć innego User-Agent. Java nie pozwoli ci pominąć User-Agent, więc musisz podać wartość, którą Java będzie obsługiwać domyślnie.

Jak najlepiej mogę powiedzieć, blokowanie Javadoc nie jest zamierzone: Javadoc tylko (chyba nierozsądnie) używa domyślnego Java User-Agent oraz sieci dostarczania treści, które javadoc.io używa bloków, które domyślnie.

(Jeszcze jedna uwaga o Maven: Wszystko działa poprawnie z -link działa też dobrze z -linkoffline jeśli pobrać plik package-list i powiedzieć Javadoc go odczytać z dysku Jednak jeśli używasz -linkoffline ale powiedz Javadoc pobrać package-list.. z adresu URL javadoc.io (jest to niecodzienna sprawa), it may fail. Problem: Maven próbuje wstępnie zweryfikować plik package-list, ale w niektórych wersjach języka Java nie działa, ponieważ odrzuca certyfikat SSL z javadoc.io, certyfikat, który zawiera Javadoc sama akceptuje.)

(O, i wydaje się ważne, aby użyć adresu URL konkretnie od static.javadoc.io, a nie javadoc.io. Ponadto, polecam https, a nie http, w przypadku gdy http://static.javadoc.io pewnego dnia rozpocznie się przekierowywanie do https://static.javadoc.io, jako Javadoc currently doesn't handle such redirects. Również, https to dobrze :))

+0

Fantastyczne wyjaśnienie i rozwiązanie, dziękuję! – krog

2

skończyło się tylko przy użyciu -linkoffline obejść ten problem, który jak sądzę ma ładny obiekt nie potrzebuje połączenia z Internetem w czasie kompilacji, ale jeśli ktoś ma dalsze przemyślenia, w jaki sposób dokonać tej pracy z -link jestem wszystko uszy.

2

To dziwne: widziałem w przeglądarce np. http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list ale kiedy dodać http://static.javadoc.io/org.pegdown/pegdown/1.6.0 jak link opcji javadoc za to mówi

Błąd pobierania URL: http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list

używam następnego rozwiązania:

  1. Z maven-dependency-plugin unapack Javadoc pożądanego uzależnienia.
  2. Połącz go z opcją 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

ja badali ten problem, problem jest to, że aplikacja kliencka musi być ustawiony (pusty ciąg znaków jest ok), aby połączenie javadoc.io aby zakończyć pomyślnie.

Rozwiązałem problem i napisałem a Gradle plugin that may be of help dla tych, którzy polegają na tym systemie kompilacji.

Niestety, obejście nie może zostać przeniesione na standardowe wywołanie komendy javadoc -link.

+1

To jest niesamowite! Świetna robota, która odkrywa przyczynę i działa, Danilo. – krog

+0

Dzięki! Nawiasem mówiąc, zapomniałem * nie * w ostatnim zdaniu: obejście może * NIE * zostać przeniesione do zwykłego wywołania linii poleceń. –

+1

Mam to do pracy z domyślną wtyczką, ustawiając właściwość systemową używaną przez Javę dla 'User-Agent' w procesie' javadoc'. Zauważ, że działa to tylko z '-link', a nie' -linkoffline', ponieważ Maven dokonuje wstępnej weryfikacji plików '-linkoffline'' pakiet-lista', a 'javadoc.io' również odrzuca żądania _Maven's_ - - choć na pozór opiera się na czymś więcej niż na sprawdzeniu "User-Agent", którego używa do odrzucenia samego "javadoc". W każdym razie magia to ' -J-Dhttp.agent = maven-javadoc-plugin - $ {pom.name} '(lub dowolny ciąg agenta, którego chcesz użyć). –

Powiązane problemy