Cara bekerja di sekitar Java 8 Javadoc yang lebih ketat saat menggunakan Maven

133

Anda akan segera menyadari bahwa JDK8 jauh lebih ketat (secara default) ketika datang ke Javadoc. ( tautan - lihat poin terakhir)

Jika Anda tidak pernah menghasilkan Javadoc maka tentu saja Anda tidak akan mengalami masalah tetapi hal-hal seperti proses rilis Maven dan mungkin membangun CI Anda tiba-tiba akan gagal di mana mereka bekerja dengan baik dengan JDK7. Apa pun yang memeriksa nilai keluar dari alat Javadoc sekarang akan gagal. JDK8 Javadoc mungkin juga lebih verbose dalam hal warningsdibandingkan dengan JDK7 tapi itu bukan cakupannya di sini. Kita bicarakan errors!

Pertanyaan ini ada untuk mengumpulkan proposal tentang apa yang harus dilakukan. Apa pendekatan terbaik? Haruskah kesalahan ini diperbaiki sekali dan untuk semua dalam file kode sumber? Jika Anda memiliki basis kode yang besar ini mungkin banyak pekerjaan. Apa pilihan lain yang ada?

Anda juga dipersilakan untuk berkomentar dengan cerita-cerita tentang apa yang sekarang gagal yang sebelumnya akan berlalu.

Kisah-kisah horor tentang apa yang sekarang gagal

alat bantu

wsimportalat adalah penghasil kode untuk menciptakan konsumen layanan web. Itu termasuk dalam JDK. Bahkan jika Anda menggunakan wsimportalat dari JDK8 itu akan tetap menghasilkan kode sumber yang tidak dapat dikompilasi dengan kompilator javadoc dari JDK8 .

@ tag penulis

Saya membuka file kode sumber berusia 3-4 tahun dan melihat ini:

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

Ini sekarang gagal karena <karakter. Sebenarnya ini dibenarkan, tapi tidak terlalu pemaaf.

Tabel HTML

Tabel HTML di Javadoc Anda? Pertimbangkan HTML yang valid ini:

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

Ini sekarang gagal dengan pesan kesalahan no summary or caption for table. Satu perbaikan cepat adalah melakukan seperti ini:

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

tetapi mengapa ini harus menjadi stop-the-world error dari alat Javadoc mengalahkan saya ??

Hal-hal yang sekarang gagal karena alasan yang lebih jelas

  1. Tautan tidak valid, mis {@link notexist}
  2. HTML salah format, mis always returns <code>true<code> if ...

MEMPERBARUI

Tautan:

Baik blog pada subjek oleh Stephen Colebourne .

peterh
sumber
13
Blog ini menunjukkan bagaimana ini dapat dimatikan: blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
Himanshu Bhardwaj
1
Anda dapat menggunakan -Xdoclintbahkan dengan javacmengatakannya untuk memeriksa dokumen saat mengkompilasi ...
Holger
1
@HimanshuBhardwaj. Terima kasih telah menautkan ke blog Stephen Colebourne. Bagian terbaik yang pernah saya baca tentang masalah ini sejauh ini!
peterh
Selain itu, salah satu "kesalahan" juga salah: 'penggunaan salah'> '- ini salah,'> 'dapat diterima dalam XML, kecuali untuk urutan spesifik']]> 'yang tidak diterima (satu of chars harus lolos). Hanya '<' harus lolos, '>' memang memiliki mnemonic (gt) untuk kenyamanan tetapi penggunaannya sepenuhnya opsional.
StaxMan
Saya bertanya-tanya ada apa dengan kepatuhan HTML 4 daripada HTML 5. Secara pribadi, saya lebih suka bahasa markup sederhana karena saya harus membaca kode sumber dan bukan hanya output cantik; dan setidaknya bagi saya HTML yang dapat dibaca manusia masih bisa diperdebatkan.
Daniel

Jawaban:

56

Untuk saat ini, cara termudah yang saya tahu untuk bekerja di sekitar Java 8 Javadoc yang lebih ketat saat menggunakan Maven adalah menonaktifkannya.

Karena parameter -Xdoclint:nonehanya ada di Java 8, mendefinisikan parameter ini memecah build untuk Java lainnya. Untuk mencegah hal ini, kita dapat membuat profil yang hanya akan aktif untuk Java 8, memastikan solusi kami berfungsi terlepas dari versi Java.

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

Cukup tambahkan itu ke POM Anda dan Anda siap melakukannya.


Untuk pengguna maven-javadoc-plugin 3.0.0:

Menggantikan

<additionalparam>-Xdoclint:none</additionalparam>

oleh

<doclint>none</doclint>

Terima kasih @banterCZ!

Fred Porciúncula
sumber
3
Saya akan menerima ini sebagai solusi yang paling mungkin bahwa kebanyakan dari kita akan menerapkan. Saya suka <activation>bagian itu. Tapi saya berharap seseorang akan datang dengan alat yang bisa melalui banyak file sumber dan membantu pengembang dalam memperbaiki kesalahan ... daripada hanya mematikan DocLint.
peterh
Hati-hati menggunakan solusi ini jika Anda mengandalkan profil lain yang aktif secara default pada saat yang sama (menggunakan activeByDefault = true).
mwhs
1
@ Peterh: Tidak ada arti mendokumentasikan sepenuhnya semuanya, itu adalah karya duplikat yang tidak berguna, dengan prinsip kode bersih, direkomendasikan untuk mendokumentasikan hanya apa yang tidak jelas, dan API publik.
Daniel Hári
1
Ini tidak bekerja dengan maven-javadoc-plugin versi 3.0.0. Saya harus kembali ke versi 3.0.0-M1 untuk membuat -Xdoclint: tidak ada yang berhasil.
Mehrad Sadegh
4
@MehradSadegh Untuk maven-javadoc-plugin versi 3.0.0 ganti saja <additionalparam>-Xdoclint:none</additionalparam> oleh<doclint>none</doclint>
banterCZ
53

Jika Anda menggunakan plugin maven javadoc, Anda dapat menggunakan failOnErroropsi untuk mencegahnya berhenti jika menemukan kesalahan html:

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

Atau Anda dapat menonaktifkan opsi html ketat sepenuhnya dengan:

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

Untuk info lebih lanjut .

assylias
sumber
2
Hmm. Masalah dengan solusi ini adalah bahwa jika Anda memikirkannya dengan JDK8 Javadoc Anda ingin tidak gagal pada kesalahan sedangkan dengan JDK7 Javadoc Anda lakukan. Jadi untuk alasan ini saya lebih suka -Xdoclintopsi. Harapannya apakah itu akan diabaikan secara diam-diam jika dijalankan dengan JDK7 Javadoc?
peterh
2
Anda dapat menerapkan opsi secara kondisional melalui profil pakar yang dikunci pada versi Java ...?
Donal Fellows
14
Tidak, dengan JDK7 gagal dengan javadoc: error - flag tidak valid: -Xdoclint: none (Oracle pekerjaan bagus).
Giovanni Toraldo
4

Sejak versi 3.0.0 dari maven-javadoc-plugin doclint dikonfigurasi melalui tag XML khusus

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

Saya suka solusi @ ThiagoPorciúncula tetapi tidak cukup jauh bagi saya.

Saya biasanya sudah memiliki additionalparamset plugin javadoc yang tidak ditimpa oleh profil. Karena itu saya harus:

  • Setel disableDoclintproperti menjadi kosong secara default.
  • Jika dalam java> = 8, atur disableDoclintproperti menjadi-Xdoclint:none
  • Penggunaan ${disableDoclint} in thetambahanparam section of themaven-javadoc-plugin`.

Ini tampaknya bekerja dengan baik meskipun bertele-tele.

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

Kemudian di bawah saya bisa menggunakan ${disableDoclint}variabel opsional di additionalparambagian yang sudah saya definisikan.

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

Ini berfungsi di bawah java 8 tetapi tidak menyebabkan kesalahan sintaksis di bawah java 7. Woo hoo!

Abu-abu
sumber
2

Perhatikan bahwa untuk kesalahan no summary or caption for table, menggunakan <table summary="">tidak akan berfungsi lagi. Jika itu situasi Anda, tambahkan <caption>elemen ke tabel Anda, seperti ini:

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

Semoga ini bisa membantu seseorang di luar sana. Butuh beberapa saat sampai saya mengetahui hal ini.

Jeronimo Backes
sumber
1
Apa versi JDK? Untuk memastikan <table summary="">trik masih bekerja pada JDK8. (baru diuji pada jdk1.8.0_201)
peterh
@ Peterh Saya menggunakan jdk 11.
Jeronimo Backes
1
Ini adalah jawaban terbaru. summary="..."atribut tidak didukung dengan HTML5 (output default untuk JDK 11 javadoc) lagi. Ini juga didukung di JDK 8.
kap