Como solucionar o Javadoc Java 8 mais rigoroso ao usar o Maven

133

Você perceberá rapidamente que o JDK8 é muito mais rigoroso (por padrão) quando se trata de Javadoc. ( link - veja o último ponto)

Se você nunca gerar nenhum Javadoc, é claro que não terá problemas, mas coisas como o processo de liberação do Maven e, possivelmente, as compilações de seus ICs falharão repentinamente onde eles funcionaram muito bem com o JDK7. Qualquer coisa que verifique o valor de saída da ferramenta Javadoc agora falhará. JDK8 Javadoc provavelmente também é mais detalhado em termos de warningsJDK7, mas esse não é o escopo aqui. Estamos a falar errors!

Esta pergunta existe para coletar propostas sobre o que fazer sobre isso. Qual é a melhor abordagem ? Esses erros devem ser corrigidos de uma vez por todas nos arquivos de código-fonte? Se você tem uma enorme base de código, pode ser muito trabalhoso. Que outras opções existem?

Você também pode comentar com histórias do que agora falha e que passaria anteriormente.

Histórias de horror do que agora falha

ferramentas wsimport

wsimportA ferramenta é um gerador de código para criar consumidores de serviços da web. Está incluído no JDK. Mesmo se você usar a wsimportferramenta do JDK8, ela produzirá código fonte que não pode ser compilado com o compilador javadoc do JDK8 .

@author tag

Estou abrindo arquivos de código fonte de 3 a 4 anos e veja o seguinte:

/**
 * My very best class
 * @author John <[email protected]> 
 */

Isso agora falha devido ao caractere <. A rigor, isso é justificado, mas não muito perdoador.

Tabelas HTML

Tabelas HTML no seu Javadoc? Considere este HTML válido:

/**
 *
 * <table>
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

Isso agora falha com a mensagem de erro no summary or caption for table. Uma solução rápida é fazer assim:

/**
 *
 * <table summary="">
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

mas por que isso tem que ser um erro de parar o mundo da ferramenta Javadoc me bate?

Coisas que agora falham por razões mais óbvias

  1. Links inválidos, por exemplo {@link notexist}
  2. HTML malformado, por exemplo always returns <code>true<code> if ...

ATUALIZAR

Ligações:

Excelente blog sobre o assunto, de Stephen Colebourne .

peterh
fonte
13
Este blog mostra como isso pode ser desativado: blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
Himanshu Bhardwaj
1
Você pode usar o -Xdoclintmesmo com javaca dizer-lhe para verificar os documentos durante a compilação ...
Holger
1
@HimanshuBhardwaj. Obrigado por criar um link para o blog de Stephen Colebourne. A melhor peça que li sobre esse assunto até agora!
Peterh
Além disso, um dos "erros" também é errado: 'mau uso de'> '- isso está errado,'> 'é perfeitamente aceitável em XML, exceto para a sequência específica de']]> 'que não é aceita (uma de caracteres deve ser escapado). Somente '<' deve ser escapado, '>' possui mnemônico (gt) por conveniência, mas seu uso é completamente opcional.
StaxMan
Gostaria de saber o que é a conformidade com o HTML 4 em vez do HTML 5. Pessoalmente, prefiro uma linguagem de marcação simples, pois tenho que ler o código-fonte e não apenas a saída bonita; e pelo menos para mim a legibilidade humana do HTML é discutível.
Daniel

Respostas:

56

Por enquanto, a maneira mais fácil de solucionar o Javadoc Java 8 mais rigoroso ao usar o Maven é desativá-lo.

Como o parâmetro -Xdoclint:noneexiste apenas no Java 8, a definição desse parâmetro interrompe a construção de qualquer outro Java. Para evitar isso, podemos criar um perfil que estará ativo apenas para o Java 8, certificando-se de que nossa solução funcione independentemente da versão do Java.

<profiles>
    <profile>
        <id>disable-java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <additionalparam>-Xdoclint:none</additionalparam>
        </properties>
    </profile>
</profiles>

Basta adicionar isso ao seu POM e você estará pronto.


Para usuários do maven-javadoc-plugin 3.0.0:

Substituir

<additionalparam>-Xdoclint:none</additionalparam>

de

<doclint>none</doclint>

Obrigado @banterCZ!

Fred Porciúncula
fonte
3
Aceito isso como a solução mais provável que a maioria de nós implementará. Eu gosto da <activation>parte. Mas eu gostaria que alguém inventasse uma ferramenta que pudesse passar por esses muitos arquivos de origem e ajudar o desenvolvedor a corrigir os erros ... em vez de simplesmente desativar o DocLint.
Peterh
Cuidado ao usar esta solução se você confiar em outro perfil ativo por padrão ao mesmo tempo (usando activeByDefault = true).
mwhs
1
@ Peterh: Não há significado de documentar completamente tudo, ou seja, um trabalho duplicado inútil; por princípios de código limpo, é recomendável documentar apenas o que não é óbvio, e a API pública.
Daniel Hári
1
Isso não funciona com o maven-javadoc-plugin versão 3.0.0. Eu tive que voltar à versão 3.0.0-M1 para fazer com que -Xdoclint: nenhum funcionasse.
Mehrad Sadegh
4
@MehradSadegh Para maven-javadoc-plugin versão 3.0.0 basta substituir <additionalparam>-Xdoclint:none</additionalparam>por<doclint>none</doclint>
banterCZ
53

Se você estiver usando o plugin maven javadoc, poderá usar a failOnErroropção para impedir que ele pare se encontrar algum erro de html:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <configuration>
    <failOnError>false</failOnError>
  </configuration>
</plugin>

Ou você pode desativar completamente as rigorosas opções de html com:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
      <additionalparam>-Xdoclint:none</additionalparam>
    </configuration>
  </plugin>
</plugins>

Para mais informações .

assylias
fonte
2
Hmm. O problema com essas soluções é que, se você pensar com o Javadoc do JDK8, não desejará erros nos erros, enquanto que com o Javadoc do JDK7. Então, por esse motivo, eu gosto mais da -Xdoclintopção. A esperança é que ele seja ignorado silenciosamente se executado com um Javadoc JDK7?
Peterh
2
Você pode aplicar a opção condicionalmente através de um perfil maven digitado na versão Java ...?
Donal Fellows
14
Não, com o JDK7, ele falha com javadoc: error - sinalizador inválido: -Xdoclint: none (bom trabalho Oracle).
Giovanni Toraldo
4

Desde a versão 3.0.0 do maven-javadoc-plugin, o doclint é configurado através da tag XML dedicada

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
       <doclint>none</doclint>
    </configuration>
</plugin>
Vlad Isajkin
fonte
3

Gosto da solução do @ ThiagoPorciúncula, mas não foi o suficiente para mim.

Normalmente, eu já tenho o additionalparamconjunto de plug-ins javadoc que não estavam sendo substituídos pelo perfil. Por causa disso, tive que:

  • Defina uma disableDoclintpropriedade para estar vazia por padrão.
  • Se em java> = 8, configure a disableDoclintpropriedade como-Xdoclint:none
  • O uso ${disableDoclint} in theadicionalparam section of themaven-javadoc-plugin`.

Isso parece funcionar bem, embora detalhado.

<properties>
    <!-- set empty property -->
    <disableDoclint></disableDoclint>
</properties>
<profiles>
    <profile>
        <id>disable-java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <!-- set property if >= java 8 -->
            <disableDoclint>-Xdoclint:none</disableDoclint>
        </properties>
    </profile>
    ...
</profiles>

Abaixo, eu poderia usar a ${disableDoclint}variável opcional na additionalparamseção que eu já havia definido.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <showPackage>false</showPackage>
                <additionalparam>-tag inheritDoc:X ${disableDoclint}</additionalparam>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <showPackage>false</showPackage>
        <bottom>This documentation content is licensed...</bottom>
        <additionalparam>-tag inheritDoc:X ${disableDoclint}</additionalparam>
    </configuration>
</plugin>

Isso funciona no java 8, mas não causa erros de sintaxe no java 7. Woo hoo!

cinzento
fonte
2

Observe que, para o erro no summary or caption for table, o uso <table summary="">não funcionará mais. Se essa for a sua situação, adicione um <caption>elemento à sua tabela, assim:

<table>
    <caption>Examples</caption>
    ...
</table>

Espero que isto seja útil a alguém. Levei um tempo até eu descobrir isso.

Jeronimo Backes
fonte
1
Qual versão do JDK? Com certeza o <table summary="">truque ainda funciona no JDK8. (testado apenas em jdk1.8.0_201)
peterh 17/02/19
@peterh I utilizado jdk 11.
Jeronimo Backes
1
Esta é a resposta atualizada. summary="..."O atributo não é mais suportado com HTML5 (a saída padrão para o JDK 11 javadoc). Também é suportado no JDK 8.
kap