วิธีแก้ปัญหา Java 8 Javadoc ที่เข้มงวดขึ้นเมื่อใช้ Maven


133

คุณจะรู้ได้อย่างรวดเร็วว่า JDK8 นั้นเข้มงวดกว่ามาก (โดยค่าเริ่มต้น) เมื่อพูดถึง Javadoc ( ลิงค์ - ดูหัวข้อย่อยสุดท้าย)

หากคุณไม่เคยสร้าง Javadoc ใด ๆ เลยแน่นอนว่าคุณจะไม่ประสบปัญหาใด ๆ แต่สิ่งต่างๆเช่นกระบวนการเผยแพร่ Maven และการสร้าง CI ของคุณอาจล้มเหลวในทันทีที่พวกเขาทำงานได้ดีกับ JDK7 ทุกสิ่งที่ตรวจสอบค่าออกของเครื่องมือ Javadoc จะล้มเหลวในขณะนี้ JDK8 Javadoc น่าจะเป็น verbose มากกว่าwarningsเมื่อเทียบกับ JDK7 แต่นั่นไม่ใช่ขอบเขตที่นี่ เรากำลังพูดถึงerrors!

คำถามนี้มีขึ้นเพื่อรวบรวมข้อเสนอเกี่ยวกับสิ่งที่ต้องทำ แนวทางที่ดีที่สุดคืออะไร? ข้อผิดพลาดเหล่านี้ควรได้รับการแก้ไขเพียงครั้งเดียวในไฟล์ซอร์สโค้ดหรือไม่ หากคุณมีฐานรหัสขนาดใหญ่สิ่งนี้อาจใช้งานได้มาก มีตัวเลือกอะไรอีกบ้าง?

นอกจากนี้คุณยังสามารถแสดงความคิดเห็นเกี่ยวกับสิ่งที่ล้มเหลวซึ่งก่อนหน้านี้จะผ่านไปได้

เรื่องราวสยองขวัญของสิ่งที่ล้มเหลวในตอนนี้

wsimport เครื่องมือ

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

อัปเดต

ลิงค์:

ยอดเยี่ยมบล็อกเกี่ยวกับเรื่องนี้โดยสตีเฟ่น Colebourne


13
บล็อกนี้แสดงวิธีปิดสิ่งนี้ได้: blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
Himanshu Bhardwaj

1
คุณสามารถใช้-Xdoclintแม้กระทั่งjavacเพื่อบอกให้ตรวจสอบเอกสารขณะรวบรวม…
Holger

1
@HimanshuBhardwaj. ขอบคุณสำหรับการเชื่อมโยงไปยังบล็อกของ Stephen Colebourne ชิ้นที่ดีที่สุดที่ฉันอ่านเกี่ยวกับเรื่องนี้จนถึงตอนนี้!
peterh

นอกจากนี้หนึ่งใน "ข้อผิดพลาด" ก็ผิดพลาดเช่นกัน: 'การใช้งานที่ไม่ถูกต้องของ'> '- สิ่งนี้ผิด'> 'เป็นที่ยอมรับอย่างสมบูรณ์ใน XML ยกเว้นลำดับเฉพาะของ']]> 'ซึ่งไม่ได้รับการยอมรับ (หนึ่ง ของอักขระจะต้องถูกหลีกเลี่ยง) ต้องใช้ "<" เท่านั้น ">" มีหน่วยความจำ (gt) เพื่อความสะดวก แต่การใช้งานเป็นทางเลือกโดยสมบูรณ์
StaxMan

ฉันสงสัยว่าอะไรคือสิ่งที่สอดคล้องกับ HTML 4 แทนที่จะเป็น HTML 5 โดยส่วนตัวฉันชอบภาษามาร์กอัปแบบง่าย ๆ เพราะฉันต้องอ่านซอร์สโค้ดไม่ใช่แค่ผลลัพธ์ที่สวยงามเท่านั้น และอย่างน้อยสำหรับฉันความสามารถในการอ่าน HTML ของมนุษย์เป็นเรื่องที่ถกเถียงกันได้
Daniel

คำตอบ:


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
peterh

ระวังการใช้โซลูชันนี้หากคุณอาศัยโปรไฟล์อื่นที่ใช้งานอยู่ตามค่าเริ่มต้นในเวลาเดียวกัน (โดยใช้ activeByDefault = true)
mwhs

1
@peterh: ไม่มีความหมายในการจัดทำเอกสารทุกอย่างทั้งหมดนั่นคืองานที่ทำซ้ำโดยไร้ประโยชน์โดยหลักการ Clean Code ขอแนะนำให้บันทึกเฉพาะสิ่งที่ไม่ชัดเจนและ API สาธารณะ
Daniel Hári

1
สิ่งนี้ใช้ไม่ได้กับ maven-javadoc-plugin เวอร์ชัน 3.0.0 ฉันต้องกลับไปที่เวอร์ชัน 3.0.0-M1 เพื่อสร้าง -Xdoclint: ไม่มีผล
Mehrad Sadegh

4
@MehradSadegh สำหรับ maven-javadoc-plugin เวอร์ชัน 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 ... ?
Donal Fellows

14
ไม่ด้วย JDK7 มันล้มเหลวด้วย javadoc: error - ไม่ถูกต้องแฟล็ก: -Xdoclint: none (งานดี Oracle)
Giovanni Toraldo

4

ตั้งแต่เวอร์ชัน 3.0.0 ของ maven-javadoc-plugin 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 theadditionalparam section of themaven-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

@peterh ฉันใช้ jdk 11.
Jeronimo Backes

1
นี่คือคำตอบล่าสุด summary="..."ไม่รองรับแอตทริบิวต์ HTML5 (เอาต์พุตเริ่มต้นสำหรับ JDK 11 javadoc) อีกต่อไป นอกจากนี้ยังรองรับใน JDK 8
kap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.