2015-11-23 13 views
10

Sto tentando di collegarmi ad alcuni Javadoc ospitati su javadoc.io (in particolare, Javadocs di PowerMock) usando l'opzione @link. Ho provato ad aggiungere l'URL a Javadocs di PowerMock al mio flag -link, ma non riesco a far sì che Javadoc lo riconosca. Sto usando link esterni ad altri Javadoc bene (ad es. Guava, Java SE 7) con Gradle come mio sistema di compilazione. Ho provato le seguenti opzioni:Collegamento a javadoc.io tramite l'opzione Javadoc -link

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

^mi hanno confermato che c'è un file package-list in questa directory

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

Tutto questi risultano nel seguente erro r (URL modificato di conseguenza):

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

Qualcuno ha consigli su come fare questo lavoro?

Per quanto posso dire questo è una sorta di javadoc.io problema specifico, anche se probabilmente un problema di utilizzo da parte mia - per esempio Attualmente sto usando -link http://junit.org/javadoc/latest/ senza alcun problema, ma -link http://static.javadoc.io/junit/junit/4.12/ non funziona.

+1

Forse eseguire javadoc con l'opzione '-verbose' darà un suggerimento, che cosa è sbagliato. – hinneLinks

+1

Purtroppo non ho ancora ottenuto nulla oltre: '[ERRORE] [system.err] javadoc: avviso - Errore recupero URL: http: // static.javadoc.io/org.powermock/powermock-core/1.6.3 /' – krog

+1

L'accesso a tali URL (versioni 'static.javadoc.io') in un browser provoca un errore di accesso negato. Javadoc probabilmente ha lo stesso risultato. – erickson

risposta

2

Dalla riga di comando, utilizzare un argomento come -J-Dhttp.agent=javadoc.

In Maven, usare qualcosa come:

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

Lo sfondo: Come Danilo Pianini suggerisce in another answer, il problema è l'intestazione User-Agent. Tuttavia, il problema non è uno vuotoUser-Agent; it's the default Java User-Agent, che sembra qualcosa di simile "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 

Quindi la correzione è di raccontare Javadoc per utilizzare un diverso User-Agent. Java non ti consente di omettere lo User-Agent, quindi dovrai fornire un valore, che verrà anteposto al suo agente predefinito.

Come meglio posso dire, il blocco dei Javadoc non è intenzionale: Javadoc solo (probabilmente incautamente) utilizza la rete di distribuzione dei contenuti che javadoc.io utilizza blocchi che per impostazione predefinita di default Java User-Agent, e.

(Una nota di più su Maven: tutto funziona bene con -link Funziona bene anche con -linkoffline se si scarica il file package-list e dire Javadoc per leggerlo dal disco Tuttavia, se si utilizza -linkoffline ma dici Javadoc per andare a prendere package-list.. dall'URL javadoc.io (questa è una cosa insolita da fare), it may fail.Il problema: Maven tenta di pre-validare il file package-list ma, in alcune versioni di Java, non riesce perché rifiuta il certificato SSL di javadoc.io, un certificato che Javadoc accetta).

(Oh, e sembra importante utilizzare un URL specifico da static.javadoc.io, non javadoc.io. Inoltre, suggerirei https, non http, nel caso http://static.javadoc.io un giorno inizierà a inviare reindirizzamenti a https://static.javadoc.io, come Javadoc currently doesn't handle such redirects. Inoltre, https è una buona cosa :))

+0

Fantastica spiegazione e soluzione, grazie! – krog

2

Ho finito con l'utilizzo di -linkoffline per aggirare questo problema, che suppongo abbia la buona proprietà di non aver bisogno di connettività internet in fase di compilazione, anche se qualcuno ha ulteriori pensieri su come farlo funzionare con -link Sono tutto orecchie.

2

È strano: ho potuto vedere nel browser, ad es. http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list ma quando aggiungo http://static.javadoc.io/org.pegdown/pegdown/1.6.0 come opzione di javadoc link dice

Errore URL recupero: http://static.javadoc.io/org.pegdown/pegdown/1.6.0/package-list

Io uso la prossima soluzione:

  1. Con maven-dependency-plugin unapack javadoc di dipendenza desiderato.
  2. Collegalo con l'opzione 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

ho studiato il problema, il problema qui è che un agente utente deve essere impostato (una stringa vuota è ok) in modo che il collegamento a javadoc.io per completare con successo.

Ho risolto il problema e ho scritto a Gradle plugin that may be of help per coloro che si affidano a quel sistema di generazione.

Sfortunatamente, il lavoro attorno non può essere trasferito al normale richiamo del comando javadoc -link.

+1

È fantastico! Un grande lavoro per capire la causa alla radice e lavorare intorno, Danilo. – krog

+0

Grazie! A proposito, ho dimenticato un * not * nell'ultima frase: la soluzione alternativa * NON * viene portata alla normale chiamata a linea di comando. –

+1

Ho capito che funziona con il plugin predefinito impostando la proprietà di sistema che Java usa per 'User-Agent' nel processo' javadoc'. Nota che questo funziona solo con '-link', non' -linkoffline', poiché Maven precalida i file '-linkoffline'' package-list', e 'javadoc.io' sembra rifiutare anche le richieste di _Maven - - anche se apparentemente basato su qualcosa di più del controllo 'User-Agent' sta usando per rifiutare' javadoc' stesso. Ad ogni modo, la magia è ' -J-Dhttp.agent = maven-javadoc-plugin - $ {pom.name} '(o qualsiasi altra stringa agente che si desidera utilizzare). –