Cách làm việc xung quanh Java 8 Javadoc chặt chẽ hơn khi sử dụng Maven


133

Bạn sẽ nhanh chóng nhận ra rằng JDK8 nghiêm ngặt hơn rất nhiều (theo mặc định) khi nói đến Javadoc. ( liên kết - xem điểm đạn cuối cùng)

Nếu bạn không bao giờ tạo bất kỳ Javadoc nào thì tất nhiên bạn sẽ không gặp phải bất kỳ vấn đề nào, nhưng những thứ như quy trình phát hành Maven và có thể các bản dựng CI của bạn sẽ đột nhiên thất bại khi chúng hoạt động tốt với JDK7. Bất cứ điều gì kiểm tra giá trị thoát của công cụ Javadoc sẽ thất bại. JDK8 Javadoc có lẽ cũng dài dòng warningshơn so với JDK7 nhưng đó không phải là phạm vi ở đây. Chúng ta đang nói về errors!

Câu hỏi này tồn tại để thu thập các đề xuất về những gì cần làm về nó. Đâu là cách tiếp cận lí tưởng nhất ? Những lỗi này có nên được sửa một lần và cho tất cả trong các tệp mã nguồn không? Nếu bạn có một cơ sở mã lớn thì đây có thể là rất nhiều công việc. Những lựa chọn khác tồn tại?

Bạn cũng được hoan nghênh bình luận với những câu chuyện về những gì bây giờ thất bại mà trước đây sẽ vượt qua.

Những câu chuyện kinh dị về những gì bây giờ thất bại

công cụ wsimport

wsimportcông cụ là một trình tạo mã để tạo người tiêu dùng dịch vụ web. Nó được bao gồm trong JDK. Ngay cả khi bạn sử dụng wsimportcông cụ từ JDK8, nó vẫn sẽ tạo mã nguồn không thể được biên dịch bằng trình biên dịch javadoc từ JDK8 .

@ Tác giả thẻ

Tôi đang mở các tệp mã nguồn 3-4 năm tuổi và thấy điều này:

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

Điều này bây giờ thất bại vì <ký tự. Nói đúng ra điều này là hợp lý, nhưng không tha thứ cho lắm.

Bảng HTML

Bảng HTML trong Javadoc của bạn? Hãy xem xét HTML hợp lệ này:

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

Điều này bây giờ thất bại với thông báo lỗi no summary or caption for table. Một cách khắc phục nhanh là làm như thế này:

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

nhưng tại sao điều này phải là một lỗi thế giới từ công cụ Javadoc đánh bại tôi ??

Những điều bây giờ thất bại vì những lý do rõ ràng hơn

  1. Liên kết không hợp lệ, vd {@link notexist}
  2. HTML không đúng định dạng, ví dụ: always returns <code>true<code> if ...

CẬP NHẬT

Liên kết:

Blog tuyệt vời về chủ đề của Stephen Colebourne .


13
Blog này cho thấy cách này có thể được tắt: blog.joda.org/2014/02/turn-off-doclint-in-jdk-8-javadoc.html
Himanshu Bhardwaj

1
Bạn có thể sử dụng -Xdoclintngay cả với javacđể nói với nó để kiểm tra tài liệu trong khi biên dịch chương trình
Holger

1
@HimanshuBhardwaj. Cảm ơn bạn đã liên kết đến blog của Stephen Colebourne. Tác phẩm hay nhất tôi từng đọc về chủ đề này cho đến nay!
peterh

Ngoài ra, một trong những "lỗi" cũng có lỗi: 'sử dụng sai'> '- điều này là sai,'> 'hoàn toàn chấp nhận được trong XML, ngoại trừ chuỗi cụ thể']]> 'không được chấp nhận (một của ký tự phải được thoát). Chỉ '<' phải được thoát, '>' không có tính năng ghi nhớ (gt) để thuận tiện nhưng việc sử dụng nó là hoàn toàn tùy chọn.
StaxMan

Tôi tự hỏi những gì với tuân thủ HTML 4 thay vì HTML 5. Cá nhân, tôi thích một ngôn ngữ đánh dấu đơn giản vì tôi phải đọc mã nguồn chứ không chỉ là đầu ra đẹp; và ít nhất đối với tôi khả năng đọc của con người về HTML là điều gây tranh cãi.
Daniel

Câu trả lời:


56

Hiện tại, cách dễ nhất mà tôi biết để làm việc xung quanh Java 8 Javadoc chặt chẽ hơn khi sử dụng Maven là tắt nó.

Do tham số -Xdoclint:nonechỉ tồn tại trong Java 8, nên việc xác định tham số này phá vỡ bản dựng cho bất kỳ Java nào khác. Để ngăn chặn điều này, chúng tôi có thể tạo một hồ sơ sẽ chỉ hoạt động cho Java 8, đảm bảo giải pháp của chúng tôi hoạt động bất kể phiên bản Java.

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

Chỉ cần thêm nó vào POM của bạn và bạn sẽ ổn.


Đối với người dùng maven-javadoc-plugin 3.0.0:

Thay thế

<additionalparam>-Xdoclint:none</additionalparam>

bởi

<doclint>none</doclint>

Cảm ơn @banterCZ!


3
Tôi sẽ chấp nhận đây là giải pháp khả thi nhất mà hầu hết chúng ta sẽ thực hiện. Tôi thích <activation>một phần. Nhưng tôi ước ai đó sẽ tìm ra một công cụ có thể đi qua nhiều tệp nguồn đó và hỗ trợ nhà phát triển sửa lỗi ... thay vì chỉ tắt DocLint.
peterh

Cẩn thận khi sử dụng giải pháp này nếu bạn dựa vào cấu hình khác đang hoạt động theo mặc định cùng một lúc (sử dụng activeByDefault = true).
mwhs

1
@peterh: Không có nghĩa là ghi lại đầy đủ tất cả mọi thứ, đó là một công việc trùng lặp vô dụng, theo nguyên tắc mã sạch, chỉ nên ghi lại những gì không rõ ràng và API công khai.
Daniel Hári

1
Điều này không hoạt động với maven-javadoc-plugin phiên bản 3.0.0. Tôi đã phải quay lại phiên bản 3.0.0-M1 để tạo -Xdoclint: không hoạt động.
Mehrad Sadegh

4
@MehradSadegh Đối với maven-javadoc-plugin phiên bản 3.0.0 chỉ cần thay thế <additionalparam>-Xdoclint:none</additionalparam>bằng<doclint>none</doclint>
banterCZ

53

Nếu bạn đang sử dụng plugin maven javadoc, bạn có thể sử dụng failOnErrortùy chọn để ngăn chặn nó dừng lại nếu nó tìm thấy bất kỳ lỗi html nào:

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

Hoặc bạn có thể hủy hoàn toàn các tùy chọn html nghiêm ngặt bằng:

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

Để biết thêm thông tin .


2
Hừm. Vấn đề với các giải pháp này là nếu bạn nghĩ về nó với JDK8 Javadoc, bạn sẽ không muốn bị lỗi trong khi với JDK7 Javadoc bạn làm. Vì vậy, vì lý do này, tôi thích tốt nhất các -Xdoclinttùy chọn. Hy vọng là nó sẽ bị bỏ qua trong âm thầm nếu được thực thi với JDK7 Javadoc?
peterh

2
Bạn có thể áp dụng tùy chọn này một cách có điều kiện thông qua một hồ sơ maven được khóa trên phiên bản Java?
Donal Fellows

14
Không, với JDK7, nó không thành công với javadoc: error - cờ không hợp lệ: -Xdoclint: none (công việc tốt của Oracle).
Giovanni Toraldo

4

Kể từ phiên bản 3.0.0 của maven-javadoc-plugin, doclint được cấu hình thông qua thẻ XML chuyên dụng

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

3

Tôi thích giải pháp của @ ThiagoPorciúncula nhưng nó không đủ xa đối với tôi.

Tôi thường đã có additionalparambộ plugin javadoc không bị ghi đè bởi hồ sơ. Vì điều này tôi đã phải:

  • Đặt thuộc disableDoclinttính để trống theo mặc định.
  • Nếu trong java> = 8, đặt thuộc disableDoclinttính thành-Xdoclint:none
  • Việc sử dụng ${disableDoclint} in thethêm section of themaven-javadoc-plugin`.

Điều này dường như hoạt động tốt mặc dù dài dòng.

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

Sau đó xuống bên dưới tôi có thể sử dụng ${disableDoclint}biến tùy chọn trong additionalparamphần mà tôi đã xác định.

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

Điều này hoạt động theo java 8 nhưng không gây ra lỗi cú pháp trong java 7. Woo hoo!


2

Lưu ý rằng đối với lỗi no summary or caption for table, sử dụng <table summary="">sẽ không hoạt động nữa. Nếu đó là tình huống của bạn, hãy thêm một <caption>yếu tố vào bảng của bạn, như thế này:

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

Hy vọng điều này sẽ giúp ai đó ngoài kia. Phải mất một lúc cho đến khi tôi phát hiện ra điều này.


1
Phiên bản nào của JDK? Để chắc chắn <table summary="">thủ thuật vẫn hoạt động trên JDK8. (vừa được thử nghiệm trên jdk1.8.0_201)
peterh

@peterh Tôi đã sử dụng jdk 11.
Jeronimo Backes 17/2/19

1
Đây là câu trả lời cập nhật. summary="..."thuộc tính không được hỗ trợ với HTML5 (đầu ra mặc định cho JDK 11 javadoc) nữa. Nó cũng được hỗ trợ trong JDK 8.
kap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.