วิธีระงับคำเตือน Java สำหรับไดเร็กทอรีหรือไฟล์เฉพาะเช่นโค้ดที่สร้างขึ้น


110

ฉันใช้โปรแกรมแยกวิเคราะห์ที่สร้างโค้ดที่ค่อนข้างน่าเกลียด เป็นผลให้โปรเจ็กต์ Eclipse ของฉันมีคำเตือนหลายโหลที่เล็ดลอดออกมาจากไฟล์ต้นฉบับที่สร้างขึ้น ฉันรู้ว่าฉันสามารถใช้@SuppressWarningคำอธิบายประกอบเพื่อระงับคำเตือนเฉพาะในองค์ประกอบบางอย่างได้ แต่คำอธิบายประกอบใด ๆ ที่ฉันเพิ่มด้วยมือจะหายไปเมื่อตัวสร้างตัวแยกวิเคราะห์ทำงานอีกครั้ง มีวิธีกำหนดค่า Eclipse เพื่อระงับคำเตือนสำหรับไฟล์หรือไดเร็กทอรีเฉพาะหรือไม่?


เกี่ยวข้องกับstackoverflow.com/questions/230199/…
Grey

คำตอบ:


91

เริ่มต้นด้วยเวอร์ชัน 3.8 M6 Eclipse (ตามความเป็นจริง: JDT) มีฟังก์ชันในตัวสำหรับสิ่งนี้ สามารถกำหนดค่าได้ผ่านเส้นทางการสร้างของโครงการ: คุณสมบัติโครงการ> เส้นทางการสร้าง Java> คอมไพเลอร์> ซอร์ส

ใส่คำอธิบายภาพที่นี่

ประกาศที่นี่: Eclipse 3.8 และ 4.2 M6 - ใหม่และโดดเด่นที่เรียกว่าการคัดเลือกละเว้นข้อผิดพลาด / คำเตือนจากโฟลเดอร์แหล่งที่มา นั่นคือที่มาของภาพหน้าจอ นี่คือคุณลักษณะใหม่ที่พัฒนาบนที่เชื่อมโยงก่อนหน้านี้Bug 220928


2
ฉันไม่พบวิธีเปลี่ยน "ไม่ใช่" -> "ใช่" ... เป็นปุ่ม "สลับ" (และไม่แก้ไขหรืออย่างอื่น) ;-)
Betlista

@ Betlista: เพียงแค่ดับเบิลคลิก หรือคลิกปุ่มสลับทางด้านขวา
altumano

1
@hheimbuerger: โซลูชันนี้ใช้ได้กับโฟลเดอร์ต้นทางเท่านั้น แต่ถ้าฉันมีโฟลเดอร์ในโปรเจ็กต์ที่มีไฟล์ XML ที่ผิดรูปแบบล่ะ? ฉันเกลียดที่จะเห็นคำเตือนเกี่ยวกับพวกเขา :(
altumano

@altumano คุณลักษณะ / ตัวเลือกข้างต้นมาจากปลั๊กอิน JDT นั่นคือการสนับสนุน Java สำหรับ Eclipse (โปรดจำไว้ว่าทุกอย่างใน Eclipse เป็นปลั๊กอินแม้กระทั่งการสนับสนุน Java ก็ไม่ได้รับการอบ) ดังนั้นคุณต้องกลับไปตรวจสอบกับผู้พัฒนาปลั๊กอินที่คุณใช้ในการตรวจสอบ XML IIRC มีมากมายดังนั้นคุณควรเปิดคำถามใหม่โดยเฉพาะสำหรับคำถามที่คุณใช้
Henrik Heimbuerger

+1. คุณใช้ระบบปฏิบัติการใด การเรนเดอร์ฟอนต์ค่อนข้างแปลก
ชื่อที่ใช้แสดง

20

มีตั๋วสำหรับสิ่งนี้Bug 220928ซึ่งได้เสร็จสิ้นแล้วสำหรับ Eclipse 3.8 โปรดดูคำตอบนี้สำหรับรายละเอียด

หากคุณติดอยู่กับคราส 3.7 หรือลด: ผู้ใช้ "มาร์ค" แสดงความคิดเห็นในตั๋วที่สร้าง (หรืออย่างน้อยถึงการเชื่อมโยง) ปลั๊กอินที่เรียกว่า 'warningcleaner ในความคิดเห็นที่ 35 ฉันใช้มันด้วยความสำเร็จมากมายในขณะที่รอให้ฟีเจอร์นี้รวมเข้ากับ Eclipse

มันค่อนข้างง่ายมาก:

  1. ติดตั้งปลั๊กอิน
  2. คลิกขวาที่โปรเจ็กต์แล้วเลือก "เพิ่ม / ลบลักษณะโค้ดที่สร้างขึ้น"
  3. เปิดการตั้งค่าโครงการ (คลิกขวาและเลือก "คุณสมบัติ")
  4. เปิดแท็บ 'Warning Cleaner'
  5. เลือกโฟลเดอร์ต้นทางที่คุณต้องการละเว้นคำเตือน

ภาพหน้าจอคำเตือน Cleaner


น่าเสียดายที่ลิงก์ไปยังปลั๊กอินให้ 403 ตอนนี้
Kutzi

1
ดูเหมือนว่ายังคงมีความคืบหน้าอยู่ (อ่านความคิดเห็นเกี่ยวกับข้อบกพร่อง) เพื่อนำไปใช้งานหลัก ตรวจสอบให้แน่ใจว่าได้อัปเดตคำถาม / คำตอบเพื่อใช้หมายเลขเวอร์ชันเฉพาะหากมีการใช้คุณลักษณะนี้ มิฉะนั้นผู้ใช้ Eclipse ในอนาคตอาจสับสน
Chris Browne

1
ฉันไม่รู้สึกว่าคำถาม / คำตอบสามารถปรับปรุงได้ในขณะนี้เนื่องจากยังไม่มีฟังก์ชันการทำงาน แต่หากมีการเพิ่มฟังก์ชันการทำงานลงในคราสแล้วควรมีคนแก้ไขสิ่งนี้ ไม่จำเป็นต้องเป็นฉัน แต่ถ้าฉันอยู่ในสถานที่ที่ถูกต้องในเวลาที่เหมาะสมฉันจะทำเช่นนั้น
Chris Browne

5
ใครมีลิงค์ปัจจุบันไปยังปลั๊กอินนี้หรือไม่? ฉันชอบที่จะใช้มัน!
Tom Tresansky

1
ข้อควรสนใจ: ตอนนี้ Eclipse มีโซลูชันในตัวสำหรับสิ่งนี้ดังที่คุณเห็นในคำตอบอื่น ๆ จาก hheimbuerger อย่างไรก็ตาม hheimbuerger คุณควร refactor คำตอบนี้ด้วยข้อมูลที่อัปเดตเพื่อให้เป็น 'ทางการ'
Roberto

18

ฉันแก้ไขสิ่งนี้โดยใช้ปลั๊กอิน maven regexp แทน - มันไม่ได้แก้สาเหตุ แต่จะช่วยรักษาความเจ็บปวด:

<plugin>
  <groupId>com.google.code.maven-replacer-plugin</groupId>
  <artifactId>maven-replacer-plugin</artifactId>
  <version>1.3.2</version>
  <executions>
<execution>
  <phase>prepare-package</phase>
  <goals>
    <goal>replace</goal>
  </goals>
</execution>
  </executions>
  <configuration>
<includes>
  <include>target/generated-sources/antlr/**/*.java</include>
</includes>

<regex>true</regex>
<regexFlags>
  <regexFlag>MULTILINE</regexFlag>
</regexFlags>

<replacements>
  <replacement>
    <token>^public class</token>
    <value>@SuppressWarnings("all") public class</value>
  </replacement>
</replacements>
  </configuration>
</plugin>

โปรดทราบว่าฉันไม่สามารถจัดการให้ ** สัญกรณ์ใช้งานได้ดังนั้นคุณอาจต้องระบุเส้นทางให้ถูกต้อง

ดูความคิดเห็นด้านล่างสำหรับการปรับปรุงวิธีไม่สร้าง @SupressWarnings ซ้ำกัน


ดังที่ Maven ไม่ได้กล่าวถึงสิ่งนี้ไม่จำเป็นต้องตอบคำถาม แต่มันใช้งานได้ดีในกรณีของฉันเมื่อฉันใช้ Maven ;-)
Kutzi

สิ่งเดียวกันสามารถทำได้หากคุณใช้ Ant แทน Maven ดูคำตอบของฉัน
Jorn

1
ดูเหมือนว่า ANTLR 3.4 จะเพิ่มคำอธิบายประกอบด้วยตัวเอง แต่ฉันชอบลักษณะทั่วไปของโซลูชัน (ไม่เพียง แต่ ANTLR จะสร้างโค้ด) ^(@SuppressWarnings\(.*?\)\s+)?public classยังคงนำไปใช้กับแหล่งที่มาทั้งหมดที่สร้างผมใช้รูปแบบนี้: การรวมคำอธิบายประกอบในรูปแบบจะไม่ซ้ำกันหากมีอยู่แล้ว
Silly Freak

สิ่งนี้ (มากหรือน้อย) ได้ผลสำหรับฉัน - ฉันต้องเพิ่ม${basedir}/ก่อนtargetใน<include>แท็ก รู้สึกค่อนข้างแย่ แต่เนื่องจากมันใช้งานได้กับไฟล์ที่สร้างขึ้นเท่านั้นฉันจะรับมัน!
Rob

7

ฉันคิดว่าสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือเปิดใช้งานการตั้งค่าเฉพาะโครงการเพื่อแสดงคำเตือน

หน้าต่าง -> การตั้งค่า -> Java -> คอมไพเลอร์ -> ข้อผิดพลาด / คำเตือน

ที่ด้านบนของแบบฟอร์มคือลิงก์สำหรับกำหนดการตั้งค่าเฉพาะโครงการ


4

ผู้ใช้ @Jorn บอกใบ้ Ant code ให้ทำสิ่งนี้ นี่คือสิ่งที่ฉันมี

<echo>Adding @SuppressWarnings("all") to ANTLR generated parser/lexer *.java</echo>
<echo> in ${project.build.directory}/generated-sources/antlr/</echo>
<replace dir="${project.build.directory}/generated-sources/antlr/" 
         summary="true" 
         includes="**/*.java" 
         token="public class" 
         value='@SuppressWarnings("all") public class' />

โปรดทราบว่า <replace> ของ Ant ทำการแทนที่ข้อความไม่ใช่การแทนที่นิพจน์ทั่วไปดังนั้นจึงไม่สามารถใช้ ^ meta-character ในโทเค็นเพื่อจับคู่จุดเริ่มต้นของบรรทัดได้เนื่องจากปลั๊กอิน maven regexp แทนที่ทำ

ฉันกำลังทำสิ่งนี้ในเวลาเดียวกันกับที่ฉันเรียกใช้ Antlr จาก maven-antrun-plugin ใน Maven pom ของฉันเนื่องจากปลั๊กอิน ANTLR maven เล่นกับปลั๊กอิน Cobertura maven ได้ไม่ดี

(ฉันรู้ว่านี่ไม่ใช่คำตอบสำหรับคำถามเดิม แต่ฉันไม่สามารถจัดรูปแบบ Ant code ในความคิดเห็น / ตอบกลับคำตอบอื่นได้ แต่เป็นคำตอบเท่านั้น)


1

ฉันไม่คิดว่า Eclipse จะให้วิธีการทำสิ่งนี้ในระดับไดเร็กทอรี (แต่ฉันไม่แน่ใจ)

คุณสามารถให้ไฟล์ที่สร้างขึ้นไปอยู่ในโปรเจ็กต์ Java แยกต่างหากและควบคุมคำเตือนสำหรับโปรเจ็กต์นั้น ๆ

โดยทั่วไปฉันชอบวางโค้ดที่สร้างขึ้นโดยอัตโนมัติในโครงการแยกต่างหากอยู่แล้ว


1

คุณสามารถระงับคำเตือนได้ในระดับโปรเจ็กต์เท่านั้น อย่างไรก็ตามคุณสามารถกำหนดค่าแท็บปัญหาของคุณเพื่อระงับคำเตือนจากไฟล์หรือแพ็กเกจ ไปที่เมนูกำหนดค่าเนื้อหาและทำงานกับขอบเขต "On working set:"


เมนูกำหนดค่าเนื้อหาไม่สมเหตุสมผลสำหรับฉัน
Chris Conway

คุณหาไม่เจอหรือคิดไม่ออกว่าจะไปทางไหนดี? ฉันใช้ Eclipse 3.4.1 (ฉันคิดว่ามันเป็นการติดตั้ง Ganymede พร้อมกับเพิ่ม PyDev) ที่มุมขวาบนของแท็บปัญหาเมื่อคุณคลิกที่ไอคอนลูกศรเล็ก ๆ เพื่อเลื่อนลงเมนูสำหรับแท็บนั้น
Greg

ฉันสามารถหามันได้ ฉันไม่เข้าใจว่าการเปลี่ยนการตั้งค่าในกล่องโต้ตอบนั้นจะสำเร็จได้อย่างไร
Chris Conway

ฉันเห็นว่ามันทำงานอย่างไร แต่คุณต้องใช้ชุดการทำงานซึ่งไม่ใช่วิธีแก้ปัญหาทั่วไป มันเพิ่มปัญหาเพราะตอนนี้คุณต้องอัปเดตชุดการทำงานของคุณเพื่อดูคำเตือนที่ถูกต้อง
Peter Dolberg

1

นี้หลามสคริปต์เล็ก "แพทช์" M2E ที่สร้าง.classpathไฟล์และเพิ่มแท็ก XML target/generated-sourcesที่จำเป็นไปยังโฟลเดอร์แหล่งที่มาทั้งหมดเริ่มต้นด้วย คุณสามารถเรียกใช้งานได้จากโฟลเดอร์รูทของโปรเจ็กต์ เห็นได้ชัดว่าคุณต้องรันใหม่เมื่อข้อมูลโปรเจ็กต์ Eclipse ถูกสร้างขึ้นใหม่จาก M2E และทั้งหมดนี้เป็นความเสี่ยงของคุณเองแน่นอน ;-)

#!/usr/bin/env python
from xml.dom.minidom import parse
import glob
import os

print('Reading .classpath files...')
for root, dirs, files in os.walk('.'):
    for name in files:
        if (name == '.classpath'):
            classpathFile = os.path.join(root, name)
            print('Patching file:' + classpathFile)
            classpathDOM = parse(classpathFile)
            classPathEntries = classpathDOM.getElementsByTagName('classpathentry')
            for classPathEntry in classPathEntries:
                if classPathEntry.attributes["path"].value.startswith('target/generated-sources'):
                    # ensure that the <attributes> tag exists
                    attributesNode = None;
                    for attributes in classPathEntry.childNodes:
                            if (attributes.nodeName == 'attributes'):
                                attributesNode = attributes

                    if (attributesNode == None):
                        attributesNode = classpathDOM.createElement('attributes')
                        classPathEntry.appendChild(attributesNode)

                    # search if the 'ignore_optional_problems' entry exists
                    hasBeenSet = 0
                    for node in attributesNode.childNodes:
                        if (node.nodeName == 'attribute' and node.getAttribute('name') == 'ignore_optional_problems'):
                            # it exists, make sure its value is true
                            node.setAttribute('value','true')
                            #print(node.getAttribute('name'))
                            hasBeenSet = 1

                    if (not(hasBeenSet)):
                        # it does not exist, add it
                        x = classpathDOM.createElement("attribute")
                        x.setAttribute('name','ignore_optional_problems')
                        x.setAttribute('value','true')
                        attributesNode.appendChild(x)

            try:
                f = open(classpathFile, "w") 
                classpathDOM.writexml(f)
                print('Writing file:' + classpathFile)
            finally:
                f.close()
print('Done.')

0

ฉันกำลังทำสิ่งนี้กับไวยากรณ์ ANTLR สองสามตัวซึ่งสร้างตัวแยกวิเคราะห์ Java โดยใช้ Ant Ant build script จะเพิ่ม@SuppressWarnings("all")ไฟล์ Java หนึ่งไฟล์และ@Overrideในอีกสองสามวิธี ฉันสามารถค้นหาวิธีการทำอย่างแน่นอนหากคุณสนใจ


ความคิดที่น่าสนใจ @SuppressWarnings ไม่จำเป็นต้องมาก่อนการประกาศคลาส (กล่าวคือไม่ง่ายเหมือนการแทรกในบรรทัดแรกของไฟล์) ใช่หรือไม่
Chris Conway

ไม่จำเป็นต้องวางไว้ที่นั่น แต่ทำได้ ฉันต้องดำลึกลงไปในเอกสารเกี่ยวกับมดเพื่อค้นหาฟังก์ชันที่เหมาะสมที่ยาก แต่ฉันไม่มีประสบการณ์กับ Ant มากนัก
Jorn

โปรดดูที่antlr.org/wiki/pages/viewpage.action?pageId=1865ซึ่งอธิบายวิธีการแก้ไขเทมเพลต ANTLR Java codegen อย่างไรก็ตามยังไม่ชัดเจนว่าจะทำงานอย่างไรเมื่อใช้ปลั๊กอิน ANTLR สำหรับ Eclipse ฉันเดาว่ามีการแฮ็กปลั๊กอิน jar หรือใช้วิธีแก้ปัญหาอื่น ๆ ที่ระบุไว้ด้านบน
djb

0

ในกรณีของ ANTLR 2 เป็นไปได้ที่จะระงับคำเตือนในโค้ดที่สร้างขึ้นโดย appenidng @SuppressWarningsก่อนการประกาศคลาสในไฟล์ไวยากรณ์เช่น

{@SuppressWarnings("all")} class MyBaseParser extends Parser;

0

สามารถทำได้โดยการยกเว้นไดเร็กทอรีบางไดเร็กทอรีจาก build path (ตัวอย่างต่อไปนี้กำหนดโดยใช้ Eclipse 3.5)

[1] เรียกใช้ Java Build Path

  • คลิกที่ project ใน Package Explorer
  • คลิกขวาคุณสมบัติ
  • เลือก Java Build Path

[2] เพิ่มไดเรกทอรีที่จะยกเว้น

  • แท็บแหล่งที่มาควรมีรายละเอียดของโฟลเดอร์แหล่งที่มาของโครงการ
  • ขยายโฟลเดอร์ต้นทางและค้นหาคุณสมบัติ 'Excluded:'
  • เลือก 'ไม่รวม:' แล้วคลิกแก้ไข
  • เพิ่มโฟลเดอร์ลงในรูปแบบการยกเว้นโดยใช้ตัวเลือกเพิ่ม / เพิ่มหลายรายการ
  • คลิกเสร็จสิ้นจากนั้นตกลงให้ Eclipse สร้างใหม่

0

เป็นเวลานานแล้วที่ฉันได้เปิดตัวปลั๊กอินคำเตือนและตอนนี้ฉันใช้ Eclipse 3.8 ฉันไม่ต้องการมันอีกต่อไป อย่างไรก็ตามสำหรับผู้ที่ยังต้องการปลั๊กอินนี้ฉันได้เปิดตัวบน github พร้อมกับไซต์อัปเดตบน bintray หากคุณยังใช้ Eclipse 3.7 หรือก่อนหน้านี้อาจเป็นประโยชน์ ตรวจสอบไซต์นี้เพื่อดูรายละเอียดการติดตั้ง


0

หากโปรเจ็กต์ eclipse ถูกสร้างขึ้นจาก gradle โดยใช้คำสั่งของปลั๊กอิน Eclipse สามารถตั้งค่าอ็อพชันได้โดยเพิ่มสิ่งนี้ที่ระดับบนสุดของไฟล์ของคุณ:eclipseSelectively ignore errors/warnings from source foldersbuild.gradle

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.each { entry -> 
            if (entry.path.contains('build/generated/parser')) {
                entry.entryAttributes['ignore_optional_problems'] = true
            }
        }
    }
}

สิ่งนี้ถือว่าแหล่งที่สร้างขึ้นอยู่ในbuild/generated/parserโฟลเดอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.