Bagaimana cara menyembunyikan peringatan Java untuk direktori atau file tertentu seperti kode yang dihasilkan

110

Saya menggunakan generator parser yang membuat kode yang agak jelek. Akibatnya, proyek Eclipse saya memiliki beberapa lusin peringatan yang berasal dari file sumber yang dihasilkan. Saya tahu saya dapat menggunakan @SuppressWarninganotasi untuk menyembunyikan peringatan tertentu dalam elemen tertentu, tetapi anotasi apa pun yang saya tambahkan secara manual akan hilang ketika generator parser berjalan lagi. Apakah ada cara untuk mengkonfigurasi Eclipse untuk menyembunyikan peringatan untuk file atau direktori tertentu?

Chris Conway
sumber

Jawaban:

91

Dimulai dengan versi 3.8 M6, Eclipse (tepatnya: JDT) memiliki fungsionalitas bawaan untuk ini. Ini dapat dikonfigurasi melalui jalur build proyek : Properti proyek> Java Build Path> Compiler> Source

masukkan deskripsi gambar di sini

Diumumkan di sini: Eclipse 3.8 dan 4.2 M6 - Baru dan Patut Disimak , disebut Abaikan kesalahan / peringatan secara selektif dari folder sumber . Dari situlah asal tangkapan layar. Ini adalah fitur baru yang dikembangkan pada Bug 220928 yang ditautkan sebelumnya .

Henrik Heimbuerger
sumber
2
Saya tidak dapat menemukan cara untuk mengganti "Tidak" -> "Ya" ... ini adalah tombol "Toggle" (dan bukan mengedit atau yang lainnya) ;-)
Betlista
@Betlista: Cukup klik dua kali. Atau klik tombol Toggle di sebelah kanan.
altumano
1
@hheimbuerger: solusi ini hanya berfungsi untuk folder sumber. Tetapi bagaimana jika saya hanya memiliki folder dalam proyek yang berisi beberapa file XML yang rusak? Saya benci melihat peringatan tentang mereka :(
altumano
@altumano Fitur / opsi di atas berasal dari plugin JDT, yaitu dukungan Java untuk Eclipse. (Ingatlah bahwa hampir semua yang ada di Eclipse adalah plugin, bahkan dukungan Java belum disertakan.) Jadi, Anda harus memeriksa kembali dengan pengembang plugin yang Anda gunakan untuk melakukan validasi XML. IIRC, ada banyak, jadi sebaiknya Anda membuka pertanyaan baru khusus untuk pertanyaan yang Anda gunakan.
Henrik Heimbuerger
+1. Omong-omong, OS mana yang Anda gunakan? Rendering font cukup aneh.
Nama Tampilan
20

Ada tiket untuk ini, Bug 220928 , yang telah diselesaikan untuk Eclipse 3.8. Silakan lihat jawaban ini untuk detailnya.

Jika Anda terjebak dengan Eclipse 3.7 atau lebih rendah: Pengguna "Marc" yang mengomentari tiket itu membuat (atau setidaknya menautkan ke) sebuah plugin yang disebut 'warningcleaner' di komentar 35 . Saya menggunakannya dengan sangat sukses sambil menunggu fitur ini diintegrasikan ke dalam Eclipse.

Ini sangat sederhana:

  1. Pasang plugin.
  2. Klik kanan proyek dan pilih "Tambahkan / hapus sifat kode yang dihasilkan".
  3. Buka pengaturan proyek (klik kanan dan pilih "properti").
  4. Buka tab 'Pembersih Peringatan'.
  5. Pilih folder sumber yang ingin Anda abaikan peringatannya.

Tangkapan layar Pembersih Peringatan

Henrik Heimbuerger
sumber
Sayangnya tautan ke plugin memberikan 403 sekarang
Kutzi
1
Tampaknya kemajuan masih dibuat (membaca komentar tentang bug) menuju implementasi inti. Pastikan untuk mengupdate pertanyaan / jawaban menggunakan nomor versi tertentu jika fitur tersebut diimplementasikan. Jika tidak, pengguna Eclipse di masa mendatang mungkin akan bingung.
Chris Browne
1
Saya tidak merasa pertanyaan / jawaban saat ini dapat ditingkatkan, karena fungsinya belum ada, tetapi jika fungsinya pernah ditambahkan ke eclipse maka seseorang harus mengedit ini. Belum tentu saya, tetapi jika saya berada di tempat yang tepat pada waktu yang tepat maka tentu saja saya akan melakukannya.
Chris Browne
5
Apakah ada yang punya link ke plugin ini? Saya ingin sekali bisa menggunakannya!
Tom Tresansky
1
Perhatian: Eclipse sekarang memiliki solusi bawaan untuk ini, seperti yang Anda lihat di jawaban lain dari hheimbuerger. Ngomong-ngomong, hheimbuerger, Anda harus memperbaiki jawaban ini dengan info terbaru untuk menjadikannya 'resmi'.
Roberto
18

Saya menyelesaikan ini dengan menggunakan plugin maven regexp replace - itu tidak menyelesaikan penyebabnya, tetapi menyembuhkan rasa sakit:

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

Perhatikan bahwa saya tidak berhasil membuat notasi ** berfungsi, jadi Anda mungkin harus menentukan jalur dengan tepat.

Lihat komentar di bawah untuk perbaikan tentang bagaimana tidak menghasilkan duplikat @SupressWarnings

Knubo
sumber
Karena Maven tidak disebutkan, ini belum tentu menjawab pertanyaan tersebut. Tapi itu berfungsi dengan baik dalam kasus saya, karena saya menggunakan Maven ;-)
Kutzi
Hal yang sama bisa dilakukan jika Anda menggunakan Ant, bukan Maven, lihat jawaban saya.
Jorn
1
tampaknya ANTLR 3.4 menambahkan anotasi dengan sendirinya, tetapi saya menyukai solusi umum (tidak hanya ANTLR yang menghasilkan kode). Masih menerapkannya ke semua sumber yang dihasilkan, saya menggunakan pola ini: ^(@SuppressWarnings\(.*?\)\s+)?public class. Dengan menyertakan anotasi dalam pola, anotasi tidak akan diduplikasi jika sudah ada.
Silly Freak
Ini (lebih atau kurang) berhasil untuk saya - saya harus menambahkan ${basedir}/sebelumnya targetdi <include>tag. Rasanya agak tersendat, tetapi karena ini hanya berfungsi pada file yang dihasilkan, saya akan menerimanya!
Rob
7

Saya pikir hal terbaik yang dapat Anda lakukan adalah mengaktifkan pengaturan khusus proyek untuk menampilkan peringatan.

Jendela -> Preferensi -> Java -> Kompiler -> Kesalahan / Peringatan

Di bagian atas formulir adalah tautan untuk mengonfigurasi pengaturan khusus proyek.

jjnguy
sumber
4

Pengguna @Jorn mengisyaratkan kode Ant untuk melakukan ini. Inilah yang saya miliki

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

Perhatikan bahwa Ant's <replace> melakukan penggantian teks, bukan penggantian ekspresi reguler, jadi Ant's tidak dapat menggunakan karakter meta ^ dalam token untuk mencocokkan awal baris seperti yang dilakukan oleh plugin maven regexp replace.

Saya melakukan ini bersamaan dengan menjalankan Antlr dari maven-antrun-plugin di Maven pom saya, karena plugin maven ANTLR tidak berfungsi dengan baik dengan plugin maven Cobertura.

(Saya menyadari ini bukan jawaban untuk pertanyaan asli, tetapi saya tidak dapat memformat kode Ant dalam komentar / balasan untuk jawaban lain, hanya dalam jawaban)

djb
sumber
1

Saya tidak berpikir Eclipse secara inheren menyediakan cara untuk melakukan ini di tingkat direktori (tapi saya tidak yakin).

Anda dapat membuat file yang dihasilkan masuk ke proyek Java yang terpisah, dan mengontrol peringatan untuk proyek tertentu itu.

Saya biasanya lebih suka menempatkan kode yang dibuat secara otomatis dalam proyek terpisah.

Uri
sumber
1

Anda hanya dapat menyembunyikan peringatan di tingkat proyek. Namun, Anda dapat mengonfigurasi tab masalah Anda untuk menyembunyikan peringatan dari file atau paket. Masuk ke menu Configure Contents dan kerjakan dengan lingkup "On working set:".

Greg
sumber
Menu Configure Contents tidak masuk akal bagi saya.
Chris Conway
Anda tidak dapat menemukannya atau Anda tidak tahu ke mana harus menavigasi di dalamnya? Saya menggunakan Eclipse 3.4.1 (Saya pikir ini adalah instalasi Ganymede dengan PyDev yang ditambahkan). Itu terletak di sudut kanan atas tab Masalah ketika Anda mengklik ikon panah kecil untuk menurunkan menu untuk tab itu.
Greg
Saya dapat menemukannya. Saya tidak mengerti apa yang akan dilakukan dengan mengubah pengaturan dalam dialog itu.
Chris Conway
Saya dapat melihat bagaimana ini bisa bekerja, tetapi kemudian Anda harus menggunakan set kerja, yang bukan solusi umum. Ini menambah masalah karena sekarang Anda harus memperbarui set kerja Anda untuk melihat peringatan yang benar.
Peter Dolberg
1

Skrip python kecil ini "menambal" .classpathfile yang dihasilkan M2E dan menambahkan tag XML yang diperlukan ke semua folder sumber yang dimulai dengan target/generated-sources. Anda bisa menjalankannya dari folder root proyek Anda. Jelas Anda perlu menjalankannya kembali ketika informasi proyek Eclipse dihasilkan kembali dari M2E. Dan semua risiko Anda sendiri, jelas ;-)

#!/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.')
opajonk
sumber
0

Saya melakukan ini ke beberapa tata bahasa ANTLR, yang menghasilkan parser Java menggunakan Ant. Skrip build Ant menambahkan @SuppressWarnings("all")ke satu file Java, dan @Overrideke beberapa metode di file lain. Saya dapat mencari tahu bagaimana tepatnya dilakukan, jika Anda tertarik.

Jorn
sumber
Ide yang menarik. Bukankah @SuppressWarnings harus muncul tepat sebelum deklarasi kelas (misalnya, tidak semudah memasukkannya pada baris pertama file)?
Chris Conway
Itu memang perlu ditempatkan di sana, tetapi itu bisa dilakukan. Saya perlu mendalami dokumentasi semut untuk menemukan bahwa fungsi yang tepat itu sulit, tetapi saya tidak memiliki banyak pengalaman dengan Ant.
Jorn
Lihat antlr.org/wiki/pages/viewpage.action?pageId=1865 yang menjelaskan cara memodifikasi template codegen Java ANTLR. Namun, tidak jelas bagaimana membuatnya bekerja saat menggunakan plugin ANTLR untuk Eclipse. Saya kira ada yang tersisa dengan meretas jar plugin atau menggunakan salah satu solusi lain yang tercantum di atas.
djb
0

Dalam kasus ANTLR 2, dimungkinkan untuk menyembunyikan peringatan dalam kode yang dihasilkan oleh appenidng @SuppressWarningssebelum deklarasi kelas dalam file tata bahasa, misalnya

{@SuppressWarnings("all")} class MyBaseParser extends Parser;
Manuel Bernhardt
sumber
0

Ini dapat dilakukan dengan mengecualikan direktori tertentu dari jalur build (Contoh berikut diberikan menggunakan Eclipse 3.5)

[1] Munculkan Jalur Build Java

  • Klik pada projectin Package Explorer
  • Klik kanan, properti
  • Pilih Java Build Path

[2] Tambahkan direktori untuk dikecualikan

  • Tab Sumber harus berisi detail folder sumber proyek
  • Luaskan folder sumber dan cari properti 'Dikecualikan:'
  • Pilih 'Dikecualikan:' dan klik Edit
  • Tambahkan folder ke dalam pola Pengecualian menggunakan opsi Tambah / Tambah Banyak
  • Klik Selesai, lalu ok untuk Eclipse membangun kembali.
Darren
sumber
0

Sudah lama sejak saya merilis plugin pembersih-peringatan, dan sekarang saya menggunakan Eclipse 3.8, saya tidak membutuhkannya lagi. Namun bagi yang masih membutuhkan plugin ini, saya sudah merilisnya di github dengan situs update di bintray. Jika Anda masih menggunakan Eclipse 3.7 atau sebelumnya, ini bisa berguna. Periksa situs ini untuk detail penginstalan.

Marc
sumber
0

Jika proyek gerhana dibuat dari gradle menggunakan perintah plugin Eclipse, opsi dapat disetel dengan menambahkan ini di tingkat atas file Anda :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
            }
        }
    }
}

Ini mengasumsikan bahwa sumber yang dihasilkan ada di build/generated/parserfolder.

Roman Konoval
sumber