Як обійти більш жорстку Java 8 Javadoc при використанні Maven


133

Ви швидко зрозумієте, що JDK8 набагато суворіший (за замовчуванням), коли мова йде про Javadoc. ( посилання - див. останній пункт кулі)

Якщо ви ніколи не генеруєте жодного Javadoc, то, звичайно, у вас не виникне жодних проблем, але такі речі, як процес випуску Maven і, можливо, ваші збірки CI раптом вийдуть з ладу там, де вони добре працювали з JDK7. Все, що перевіряє значення виходу інструменту Javadoc, тепер не вдасться. JDK8 Javadoc, ймовірно, також є більш багатослівним в warningsпорівнянні з JDK7, але це не в цій галузі. Ми говоримо про errors!

Це питання існує для збору пропозицій щодо того, що з цим робити. Який найкращий підхід? Чи слід ці помилки виправляти раз у раз у файлах вихідного коду? Якщо у вас є величезна база коду, це може бути багато роботи. Які ще існують варіанти?

Ви також можете прокоментувати розповіді про те, що зараз не вдалося, що раніше пройшло.

Страшилки про те, що зараз не вдається

Інструменти для імпорту

wsimportІнструмент - це генератор коду для створення споживачів веб-служб. Він включений до JDK. Навіть якщо ви використовуєте wsimportінструмент від JDK8, він все-таки створить вихідний код, який неможливо скомпілювати з компілятором javadoc з JDK8 .

Тег @author

Я відкриваю файли вихідного коду 3-4 років і бачу це:

/**
 * My very best class
 * @author John <john.doe@mine.com> 
 */

Тепер це не вдається через символ <. Строго кажучи, це виправдано, але не дуже прощає.

Таблиці HTML

Таблиці HTML у вашому Javadoc? Розглянемо цей дійсний HTML:

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

Тепер це не вдається з повідомленням про помилку no summary or caption for table. Одне швидке виправлення - це зробити так:

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

але чому це повинно бути помилкою зупинки світу від інструменту Javadoc б'є мене ??

Речі, які зараз провалюються з більш очевидних причин

  1. Недійсні посилання, наприклад {@link notexist}
  2. Неправильний HTML, наприклад always returns <code>true<code> if ...

ОНОВЛЕННЯ

Посилання:

Відмінний блог на цю тему зі Стівеном Колборн .


13
Цей блог показує, як це можна вимкнути: blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
Himanshu Bhardwaj

1
Ви можете використовувати -Xdoclintнавіть з, javacщоб сказати, щоб перевірити документи під час компіляції…
Holger

1
@HimanshuBhardwaj. Дякуємо за посилання на блог Стівена Колбурна. Найкращий твір, який я прочитав на цю тему до цих пір!
петер

Крім того, одна з "помилок" також помилкова: "неправильне використання '>' - це неправильно, '>' цілком прийнятно в XML, за винятком конкретної послідовності ']]>', яка не приймається (одна символів потрібно уникати). Тільки '<' необхідно уникати, '>' має мнемонічний (gt) для зручності, але його використання є абсолютно необов’язковим.
StaxMan

Мені цікаво, що з відповідністю HTML 4 замість HTML 5. Особисто я віддаю перевагу простій мові розмітки, оскільки мені доводиться читати вихідний код, а не лише гарний вихід; і, принаймні, для мене читабельність HTML-коду є дискусійною.
Даніель

Відповіді:


56

Наразі найпростіший спосіб, який я знаю, обійти більш жорстку Java 8 Javadoc під час використання Maven - це її деактивація.

Оскільки параметр -Xdoclint:noneіснує лише в Java 8, визначення цього параметра розбиває збірку для будь-якої іншої Java. Щоб цього не допустити, ми можемо створити профіль, який буде активним лише для Java 8, переконавшись, що наше рішення працює незалежно від версії Java.

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

Просто додайте це до своєї POM, і ви готові йти.


Для користувачів maven-javadoc-plugin 3.0.0:

Замініть

<additionalparam>-Xdoclint:none</additionalparam>

від

<doclint>none</doclint>

Дякую @banterCZ!


3
Я прийму це як найбільш вірогідне рішення, яке реалізує більшість із нас. Мені подобається <activation>частина. Але я б хотів, щоб хтось придумав інструмент, який міг би пройти ці безлічі вихідних файлів і допомогти розробнику у виправленні помилок ... а не просто вимкнути DocLint.
петер

Остерігайтеся використання цього рішення, якщо ви покладаєтесь, що інший профіль буде активним за замовчуванням одночасно (використовуючи activeByDefault = true).
mwhs

1
@peterh: Немає сенсу повністю документувати все, тобто марно дублювати роботу, за принципами чистого коду рекомендується документувати лише те, що не очевидно, та публічний API.
Даніель Харі

1
Це не працює з Maven-javadoc-плагіном версії 3.0.0. Мені довелося повернутися до версії 3.0.0-M1 для створення -Xdoclint: жодної роботи.
Мехрад Садег

4
@MehradSadegh Для Maven-javadoc-плагіна версії 3.0.0 просто замініть <additionalparam>-Xdoclint:none</additionalparam>на<doclint>none</doclint>
banterCZ

53

Якщо ви використовуєте плагін Maven javadoc, ви можете скористатися failOnErrorопцією, щоб запобігти його зупинці, якщо він знайде помилки html:

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

Або ви можете повністю відключити строгі параметри HTML за допомогою:

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

Для отримання додаткової інформації .


2
Хм. Проблема цих рішень полягає в тому, що якщо ви думаєте про це з JDK8 Javadoc, ви б хотіли не зазнати помилок, тоді як з JDK7 Javadoc ви це робите. Тому з цієї причини мені найбільше подобається -Xdoclintваріант. Сподіваємось, що вона буде мовчки ігнорована, якщо виконана за допомогою JDK7 Javadoc?
peterh

2
Ви можете застосувати цю опцію умовно через профіль Maven, введений у версії Java…?
Стипендіати

14
Ні, з JDK7 він не вдається з javadoc: error - недійсний прапор: -Xdoclint: none (хороша робота Oracle).
Джованні Торальдо

4

Оскільки версія 3.0.0 maven-javadoc-плагіна, doclint налаштовується за допомогою виділеного тегу XML

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

3

Мені подобається рішення @ ThiagoPorciúncula, але це не зовсім пішло для мене.

У мене зазвичай є additionalparamнабір плагінів javadoc , які не перекривались профілем. Через це мені довелося:

  • Встановіть disableDoclintвластивість порожнім за замовчуванням.
  • Якщо в Java> = 8, встановіть disableDoclintвластивість бути-Xdoclint:none
  • Використовуйте ${disableDoclint} in theдодатковий section of theмодуль maven-javadoc-plugin`.

Це, здається, добре працює, хоч і багатослівне.

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

Тоді внизу я міг би використовувати необов'язкові ${disableDoclint}змінні в additionalparamрозділі, який я вже визначив.

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

Це працює під java 8, але не викликає синтаксичних помилок під java 7. Woo hoo!


2

Зауважте, що для помилки no summary or caption for tableвикористання <table summary="">більше не працюватиме. Якщо це ваша ситуація, додайте <caption>до таблиці такий елемент, як ось такий:

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

Сподіваюся, це допомагає комусь там. Минуло деякий час, поки я не з'ясував це.


1
Яка версія JDK? Напевно, <table summary="">фокус все ще працює на JDK8. (щойно перевірено на jdk1.8.0_201)
п'ятницю

@peterh Я використав jdk 11.
Jeronimo

1
Це актуальна відповідь. summary="..."атрибут більше не підтримується HTML5 (вихід за замовчуванням для JDK 11 javadoc). Він також підтримується в JDK 8.
кап
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.