Oluşturulan kod gibi belirli dizinler veya dosyalar için Java uyarıları nasıl engellenir


110

Biraz çirkin kod oluşturan bir ayrıştırıcı oluşturucu kullanıyorum. Sonuç olarak, Eclipse projemde üretilen kaynak dosyalardan çıkan birkaç düzine uyarı var. @SuppressWarningEk açıklamayı belirli öğelerdeki belirli uyarıları bastırmak için kullanabileceğimi biliyorum , ancak el ile eklediğim tüm açıklamalar ayrıştırıcı oluşturucu tekrar çalıştığında kaybolacak. Eclipse'i belirli bir dosya veya dizin için uyarıları engelleyecek şekilde yapılandırmanın bir yolu var mı?


Yanıtlar:


91

3.8 M6 sürümünden başlayarak, Eclipse (tam olarak: JDT) bunun için yerleşik işlevselliğe sahiptir. Bir projenin derleme yolu aracılığıyla yapılandırılabilir: Proje özellikleri> Java Derleme Yolu> Derleyici> Kaynak

görüntü açıklamasını buraya girin

Burada duyurulan: Eclipse 3.8 ve 4.2 M6 - Yeni ve Dikkate Değer , kaynak klasörlerdeki hataları / uyarıları seçmeli olarak yoksay olarak adlandırılır . Ekran görüntüsü de buradan geliyor. Bu, daha önce bağlantılı olan Bug 220928'de geliştirilen yeni özelliktir .


2
"Hayır" -> "Evet" arasında nasıl geçiş yapacağımı bulamadım ... "Değiştir" düğmesi (ve düzenleme veya başka bir şey değil) ;-)
Betlista

@Betlista: Sadece çift tıklayın. Veya sağdaki Geçiş düğmesini tıklayın.
altumano

1
@hheimbuerger: Bu çözüm yalnızca kaynak klasörler için çalışır. Peki ya projede bazı hatalı biçimlendirilmiş XML dosyaları içeren bir klasörüm varsa? Onlarla ilgili uyarıları görmekten nefret ediyorum :(
altumano

@altumano Yukarıdaki özellik / seçenek JDT eklentisinden, yani Eclipse için Java desteğinden gelir. (Eclipse'deki hemen hemen her şeyin bir eklenti olduğunu, Java desteğinin bile pişirilmediğini unutmayın.) Dolayısıyla, XML doğrulamasını yapmak için kullandığınız eklentinin geliştiricisine tekrar danışmanız gerekir. IIRC, çok sayıda var, bu nedenle muhtemelen özellikle kullandığınız soru için yeni bir soru açmalısınız.
Henrik Heimbuerger

+1. Bu arada, hangi işletim sistemini kullandınız? Yazı tipi oluşturma oldukça garip.
Görünen Ad

20

Bunun için bir bilet var, Bug 220928 , o zamandan beri Eclipse 3.8 için tamamlandı. Bakınız bu cevabı detayları için.

Eclipse 3.7 veya daha düşük bir sürümde takıldıysanız: Bu biletle ilgili yorum yapan "Marc" adlı kullanıcı, yorum 35'te 'warningcleaner' adlı bir eklenti oluşturdu (veya en azından ona bağlantı verdi) . Bu özelliğin Eclipse'e entegre edilmesini beklerken bunu çok başarılı bir şekilde kullanıyorum.

Gerçekten oldukça basit:

  1. Eklenti kur.
  2. Projeye sağ tıklayın ve "Oluşturulan kod niteliğini ekle / kaldır" ı seçin.
  3. Proje ayarlarını açın (sağ tıklayın ve "özellikler" i seçin).
  4. 'Uyarı Temizleyici' sekmesini açın.
  5. Uyarıları göz ardı etmek istediğiniz kaynak klasörleri seçin.

Uyarı Temizleyici ekran görüntüsü


Maalesef eklentiye bağlantı şimdi 403 veriyor
Kutzi

1
Çekirdek uygulamaya doğru hala ilerleme kaydedildiği (hata hakkındaki yorumları okunduğu) görülmektedir. Özellik uygulanırsa belirli sürüm numaralarını kullanmak için soruyu / yanıtı güncellediğinizden emin olun. Aksi takdirde, Eclipse'in gelecekteki kullanıcılarının kafası karışabilir.
Chris Browne

1
Henüz işlevsellik olmadığından, sorunun / cevabın şu anda iyileştirilebileceğini düşünmüyorum, ancak işlevsellik tutulmaya eklenirse, o zaman birinin bunu düzenlemesi gerekir. İlle ben değil, ama doğru zamanda doğru yerdeysem, o zaman elbette yapacağım.
Chris Browne

5
Bu eklentiye güncel bir bağlantısı olan var mı? Kullanabilmeyi çok isterim!
Tom Tresansky

1
Dikkat: hheimbuerger'ın diğer yanıtında da görebileceğiniz gibi Eclipse artık bunun için yerleşik bir çözüme sahip. Bu arada, hheimbuerger, bu yanıtı 'resmi' yapmak için güncellenmiş bilgilerle yeniden düzenlemelisin.
Roberto

18

Bunu maven regexp replace eklentisini kullanarak çözdüm - nedeni çözmez, ancak acıyı iyileştirir:

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

** gösterimini çalıştırmayı başaramadığımı, bu nedenle yolu tam olarak belirtmeniz gerekebileceğini unutmayın.

Yinelenen @SupressWarnings'in nasıl oluşturulmayacağına ilişkin iyileştirme için aşağıdaki yoruma bakın


Maven'den söz edilmediği için, bu soruya mutlaka cevap vermiyor. Ama benim durumumda harika çalışıyor, çünkü Maven ;-)
Kutzi

Maven yerine Ant kullanıyorsanız aynı şey yapılabilir, cevabıma bakın.
Jorn

1
Görünüşe göre ANTLR 3.4 ek açıklamayı kendi başına ekliyor, ancak çözümün genelliğini seviyorum (yalnızca ANTLR kod oluşturmaz). Hala tüm oluşturulan kaynaklardan uygulamak için, bu modelini kullanın: ^(@SuppressWarnings\(.*?\)\s+)?public class. Modele ek açıklama dahil edildiğinde, zaten oradaysa çoğaltılmaz.
Silly Freak

Bu (daha fazla veya daha az) benim için çalıştı - Ben eklemek zorunda ${basedir}/önce targetde <include>etiketinin. Biraz kötü hissediyor, ancak yalnızca oluşturulan dosyalarda çalıştığı için kabul edeceğim!
Rob

7

Sanırım yapabileceğiniz en iyi şey, uyarıları görüntülemek için projeye özel ayarları etkinleştirmek.

Pencere -> Tercihler -> Java -> Derleyici -> Hatalar / Uyarılar

Formun üst kısmında, projeye özel ayarları yapılandırmak için bir bağlantı vardır.


4

Kullanıcı @Jorn, bunu yapmak için Ant kodunu ima etti. İşte sahip olduğum şey

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

Ant'ın <replace> öğesinin normal ifade yerine metin değişimi yaptığına dikkat edin, bu nedenle maven regexp değiştirme eklentisi gibi satırın başlangıcını eşleştirmek için belirteçte ^ meta karakterini kullanamaz.

Bunu, Antlr'ı Maven pom'umdaki maven-antrun-eklentisinden çalıştırırken aynı zamanda yapıyorum, çünkü ANTLR maven eklentisi Cobertura maven eklentisiyle iyi çalışmıyordu.

(Bunun orijinal soruya bir cevap olmadığını anlıyorum, ancak Ant kodunu bir yorumda / başka bir yanıta yanıt olarak biçimlendiremiyorum, yalnızca yanıtta)


1

Eclipse'in doğası gereği bunu dizin seviyesinde yapmanın bir yolunu sağladığını sanmıyorum (ama emin değilim).

Oluşturulan dosyaların ayrı bir Java projesine gitmesini ve bu belirli proje için uyarıları kontrol etmesini sağlayabilirsiniz.

Genelde otomatik olarak oluşturulan kodu yine de ayrı bir projeye yerleştirmeyi tercih ederim.


1

Uyarıları yalnızca proje düzeyinde bastırabilirsiniz. Ancak, dosyalar veya paketlerden gelen uyarıları bastırmak için sorunlar sekmenizi yapılandırabilirsiniz. İçeriği Yapılandır menüsüne gidin ve "Çalışma kümesinde:" kapsamıyla çalışın.


Configure Contents (İçeriği Yapılandır) menüsü bana hiç mantıklı gelmiyor.
Chris Conway

Onu bulamıyor musunuz veya içinde nereye gideceğinizi bulamıyor musunuz? Eclipse 3.4.1 kullanıyorum (PyDev eklenmiş bir Ganymede kurulumu olduğunu düşünüyorum). Söz konusu sekmenin menüsünü açmak için küçük ok simgesine tıkladığınızda Sorunlar sekmesinin sağ üst köşesinde bulunur.
Greg

Onu bulabilirim. Bu iletişim kutusundaki ayarları değiştirmenin neyi başaracağını anlamıyorum.
Chris Conway

Bunun nasıl çalıştığını görebiliyorum, ancak o zaman genel bir çözüm olmayan çalışma setlerini kullanmanız gerekir. Doğru uyarıları görmek için artık çalışma setinizi güncellemeniz gerektiğinden, soruna eklenir.
Peter Dolberg

1

Bu küçük python betiği M2E tarafından oluşturulan .classpathdosyaları "yamalar" ve ile başlayan tüm kaynak klasörlere gerekli XML etiketini ekler target/generated-sources. Sadece projenizin kök klasöründen çalıştırabilirsiniz. Açıktır ki, Eclipse proje bilgisi M2E'den yeniden oluşturulduğunda onu yeniden çalıştırmanız gerekir. Ve hepsi kendi sorumluluğunuzdadır, tabii ki ;-)

#!/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

Bunu, Ant kullanarak bir Java ayrıştırıcısı oluşturan birkaç ANTLR gramerine yapıyorum. Ant oluşturma betiği @SuppressWarnings("all"), bir Java dosyasına ve @Overridediğerinde birkaç yönteme ekler . Eğer ilgilenirseniz, tam olarak nasıl yapıldığına bakabilirim.


İlginç bir fikir. @SuppressWarnings öğesinin sınıf bildiriminden hemen önce gelmesi gerekmiyor mu (yani, dosyanın ilk satırına eklemek kadar kolay değil)?
Chris Conway

Oraya yerleştirilmesi gerekiyor, ancak yapılabilir. Doğru işlevi zor bulmak için karınca dokümantasyonunun derinliklerine dalmam gerekiyordu, ancak Ant ile çok fazla deneyimim yok.
Jorn

ANTLR Java kod oluşturucu şablonunun nasıl değiştirileceğini açıklayan antlr.org/wiki/pages/viewpage.action?pageId=1865'e bakın . Ancak, Eclipse için ANTLR eklentisi kullanılırken bunun nasıl çalışacağı açık değildir. Sanırım biri eklenti kavanozunu hacklemek veya yukarıda listelenen diğer geçici çözümlerden birini kullanmakla kaldı.
djb

0

ANTLR 2 durumunda, üretilen koddaki uyarıları @SuppressWarningsdilbilgisi dosyasındaki sınıf bildiriminden önce ekleyerek bastırmak mümkündür , örn.

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

0

Bu, belirli dizinlerin derleme yolundan çıkarılmasıyla yapılabilir (Aşağıdaki örnek Eclipse 3.5 kullanılarak verilmiştir)

[1] Java Derleme Yolunu Açın

  • Paket Gezgini'nde projeye tıklayın
  • Sağ tıklama, özellikler
  • Java Derleme Yolunu Seçin

[2] Hariç tutulacak dizinleri ekleyin

  • Kaynak sekmesi proje kaynak klasörlerinin ayrıntılarını içermelidir
  • Kaynak klasörü genişletin ve "Hariç tutuldu:" özelliğini bulun
  • "Hariç Tutulan:" ı seçin ve Düzenle'yi tıklayın
  • Birden Çok Ekle / Ekle seçeneklerini kullanarak Dışlama modellerine klasörler ekleyin
  • Bitir'e tıklayın, ardından Eclipse'in yeniden oluşturması için Tamam'a tıklayın.

0

Uyarı temizleyici eklentisini yayınladığımdan bu yana bir süre geçti ve şimdi Eclipse 3.8'i kullandığım için artık buna ihtiyacım yok. Ancak yine de bu eklentiye ihtiyaç duyanlar için, onu bintray'deki güncelleme sitesi ile github'da yayınladım. Hala Eclipse 3.7 veya önceki bir sürümünü kullanıyorsanız, bu yararlı olabilir. Kurulum ayrıntıları için bu siteyi kontrol edin .


0

Eclipse projesi, Eclipse eklentisinin eclipse komutu kullanılarak gradle'dan oluşturulmuşsa , Selectively ignore errors/warnings from source foldersseçenek, bunu build.gradledosyanızın en üst seviyesine ekleyerek ayarlanabilir :

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

Bu, oluşturulan kaynakların build/generated/parserklasörde olduğunu varsayar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.