विशिष्ट निर्देशिका या उत्पन्न कोड जैसे फ़ाइलों के लिए जावा चेतावनी को कैसे दबाएं


110

मैं एक पार्सर जनरेटर का उपयोग कर रहा हूं जो कुछ बदसूरत कोड बनाता है। परिणामस्वरूप मेरी ग्रहण परियोजना में कई दर्जन चेतावनियाँ हैं जो उत्पन्न स्रोत फ़ाइलों से निकलती हैं। मुझे पता है कि मैं @SuppressWarningविशेष तत्वों में विशेष चेतावनियों को दबाने के लिए एनोटेशन का उपयोग कर सकता हूं , लेकिन जो भी एनोटेशन मैं हाथ से जोड़ता हूं, जब पार्सर जनरेटर फिर से चलेगा। क्या किसी विशेष फ़ाइल या निर्देशिका के लिए चेतावनी को दबाने के लिए ग्रहण को कॉन्फ़िगर करने का एक तरीका है?


जवाबों:


91

संस्करण 3.8 एम 6 के साथ शुरू, ग्रहण (सटीक होना: जेडीटी) ने इसके लिए अंतर्निहित कार्यक्षमता बनाई है। यह प्रोजेक्ट के बिल्ड पथ के माध्यम से कॉन्फ़िगर करने योग्य है: प्रोजेक्ट गुण> जावा बिल्ड पथ> कंपाइलर> स्रोत

यहां छवि विवरण दर्ज करें

यहां घोषणा की गई: ग्रहण 3.8 और 4.2 एम 6 - नए और उल्लेखनीय , स्रोत फ़ोल्डर से त्रुटियों / चेतावनियों को अनदेखा करें । वह भी जहां स्क्रीनशॉट है। यह पहले से जुड़े बग 220928 पर विकसित नई सुविधा है ।


2
मुझे नहीं पता चला कि कैसे "नहीं" -> "हां" स्विच किया जा सकता है ... यह "टॉगल" बटन है (और संपादित या कुछ और नहीं) ;-)
बेटलिस्टा

@ बिटलिस्ट: बस इसे डबल-क्लिक करें। या दाईं ओर टॉगल बटन पर क्लिक करें।
10

1
@hheimbuerger: यह समाधान केवल स्रोत फ़ोल्डरों के लिए काम करता है। लेकिन क्या होगा अगर मेरे पास प्रोजेक्ट में एक फ़ोल्डर है जिसमें कुछ विकृत एक्सएमएल फाइलें हैं? मुझे उनके बारे में चेतावनी देखने से नफरत है :(
altumano

@altumano उपरोक्त सुविधा / विकल्प JDT प्लगइन, यानी ग्रहण के लिए जावा समर्थन से आता है। (याद रखें कि एक्लिप्स में सब कुछ एक प्लगइन है, यहां तक ​​कि जावा समर्थन भी बेक नहीं किया गया है।) इसलिए आपको उस प्लगइन के डेवलपर के साथ वापस जांचना होगा जिसे आप XML सत्यापन करने के लिए उपयोग करते हैं। IIRC, कई हैं, इसलिए आपको विशेष रूप से आपके द्वारा उपयोग किए जा रहे एक नए प्रश्न को खोलना चाहिए।
हेनरिक हेमबर्गर 21

+1। वैसे, आपने किस ओएस का उपयोग किया? फ़ॉन्ट रेंडरिंग काफी अजीब है।
प्रदर्शन नाम

20

इसके लिए एक टिकट है, बग 220928 , जो तब से ग्रहण 3.8 के लिए पूरा हो चुका है। कृपया विवरण के लिए इस उत्तर को देखें।

यदि आप ग्रहण 3.7 या निम्न के साथ फंस गए हैं: उपयोगकर्ता "मार्क" उस टिकट पर टिप्पणी कर रहा है (या कम से कम लिंक) एक प्लगइन को टिप्पणी 35 में 'वार्निंगक्लाइनर' कहा जाता है । इस सुविधा के ग्रहण में एकीकृत होने की प्रतीक्षा करते हुए मैं इसका भरपूर उपयोग कर रहा हूं।

यह वास्तव में काफी सरल है:

  1. प्लग मैं स्थापित।
  2. प्रोजेक्ट राइट-क्लिक करें और "जनरेट कोड प्रकृति जोड़ें / निकालें" चुनें।
  3. प्रोजेक्ट सेटिंग्स खोलें (राइट-क्लिक करें और "गुण" चुनें)।
  4. टैब खोलें 'वार्निंग क्लीनर'।
  5. उस स्रोत फ़ोल्डर का चयन करें जिसे आप चेतावनियों से अनदेखा करना चाहते हैं।

चेतावनी क्लीनर स्क्रीनशॉट


दुर्भाग्य से प्लगइन का लिंक अब 403 देता है
कुटज़ी

1
ऐसा प्रतीत होता है कि प्रगति अभी भी चल रही है (बग पर टिप्पणियों को पढ़ना) एक कोर कार्यान्वयन के लिए। यदि सुविधा लागू है तो विशिष्ट संस्करण संख्याओं का उपयोग करने के लिए प्रश्न / उत्तर को अपडेट करना सुनिश्चित करें। अन्यथा, ग्रहण के भावी उपयोगकर्ता भ्रमित हो सकते हैं।
क्रिस ब्राउन ने

1
मुझे नहीं लगता कि प्रश्न / उत्तर को वर्तमान में सुधार किया जा सकता है, क्योंकि कार्यक्षमता अभी तक मौजूद है, लेकिन अगर कार्यक्षमता को कभी ग्रहण में जोड़ा जाता है तो किसी को इसे संपादित करना चाहिए। जरूरी नहीं कि मैं, लेकिन अगर मैं सही समय पर सही जगह पर हूं तो निश्चित रूप से मैं ऐसा करूंगा।
क्रिस ब्राउन ने

5
क्या किसी के पास इस प्लगइन का करंट लिंक है? मैं इसका इस्तेमाल करने में सक्षम होना पसंद करूंगा!
टॉम ट्राँसस्की

1
ध्यान दें: ग्रहण के पास अब इसके लिए एक अंतर्निहित समाधान है, जैसा कि आप अन्य उत्तर में हैम्बर्गर से देख सकते हैं। वैसे, हिम्हेबर्गर, आपको यह उत्तर अद्यतन जानकारी के साथ देना चाहिए ताकि इसे 'आधिकारिक' बनाया जा सके।
रॉबर्टो

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 उत्पन्न नहीं करने के तरीके में सुधार के लिए नीचे टिप्पणी देखें


चूंकि मावेन का उल्लेख नहीं किया गया था, इसलिए यह जरूरी नहीं है कि प्रश्न का उत्तर दिया जाए। लेकिन यह मेरे मामले में बहुत अच्छा काम करता है, क्योंकि मैं मावेन का उपयोग करता हूं ;-)
कुटज़ी

यदि आप मावेन के बजाय चींटी का उपयोग कर रहे हैं तो वही काम किया जा सकता है, मेरा उत्तर देखें।
Jorn

1
ऐसा लगता है कि ANTLR 3.4 एनोटेशन को खुद से जोड़ता है, लेकिन मुझे समाधान की व्यापकता पसंद है (न केवल ANTLR कोड उत्पन्न करता है)। अभी भी इसे सभी उत्पन्न स्रोतों पर लागू करने के लिए, मैं इस पैटर्न का उपयोग करता हूं ^(@SuppressWarnings\(.*?\)\s+)?public class:। एनोटेशन को पैटर्न में शामिल करके, यदि यह पहले से ही है तो इसे डुप्लिकेट नहीं किया जाता है।
सिली फ्रीक

यह (कम या ज्यादा) मेरे लिए काम किया - मुझे टैग में ${basedir}/पहले जोड़ना था । थोड़े जानकी लगता है, लेकिन चूंकि यह केवल उत्पन्न फ़ाइलों पर काम करता है, इसलिए मैं इसे ले जाऊंगा! target<include>
रोब

7

मुझे लगता है कि आप जो सबसे अच्छा कर सकते हैं वह चेतावनी प्रदर्शित करने के लिए परियोजना विशिष्ट सेटिंग्स को सक्षम करना है।

विंडो -> वरीयताएँ -> जावा -> संकलक -> त्रुटियां / चेतावनी

प्रपत्र के शीर्ष पर प्रोजेक्ट विशिष्ट सेटिंग्स को कॉन्फ़िगर करने के लिए एक लिंक है।


4

उपयोगकर्ता @Jorn ने ऐसा करने के लिए चींटी कोड पर संकेत दिया। यहाँ मेरे पास क्या है

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

ध्यान दें कि चींटी का <बदलें> पाठ प्रतिस्थापन करता है, नियमित अभिव्यक्ति प्रतिस्थापन नहीं, इसलिए यह टोकन के ^ मेटा-चरित्र का उपयोग लाइन की शुरुआत से मेल खाने के लिए नहीं कर सकता है क्योंकि मावेन रेगेक्सप प्लगइन को प्रतिस्थापित करता है।

मैं एक ही समय में ऐसा कर रहा हूं कि मैं अपने मावेन पोम में मावेन-एंट्रॉन-प्लगइन से एंट्रेल चलाता हूं, क्योंकि एएनटीएलआर मावेन प्लगइन कोबर्टा मावेन प्लगइन के साथ अच्छा नहीं खेलता था।

(मुझे पता है कि यह मूल प्रश्न का उत्तर नहीं है, लेकिन मैं एंट कोड को टिप्पणी में नहीं लिख सकता / किसी अन्य उत्तर का उत्तर केवल एक उत्तर में दे सकता हूं)


1

मुझे नहीं लगता कि ग्रहण स्वाभाविक रूप से निर्देशिका स्तर पर ऐसा करने का एक तरीका प्रदान करता है (लेकिन मुझे यकीन नहीं है)।

आप उत्पन्न की गई फ़ाइलों को एक अलग जावा परियोजना में जा सकते हैं, और उस विशिष्ट परियोजना के लिए चेतावनी को नियंत्रित कर सकते हैं।

मैं आम तौर पर वैसे भी एक अलग परियोजना में स्वचालित रूप से उत्पन्न कोड रखना पसंद करता हूं।


1

आप केवल प्रोजेक्ट स्तर पर चेतावनी को दबा सकते हैं। हालाँकि, आप अपनी समस्याओं टैब को फ़ाइलों या पैकेजों से चेतावनी को दबाने के लिए कॉन्फ़िगर कर सकते हैं। कंफिगर कॉन्टेंट्स मेनू में जाएं और "ऑन वर्किंग सेट:" स्कोप के साथ काम करें।


कॉन्फ़िगर करें विषय मेनू मेरे लिए कोई अर्थ नहीं रखता है।
क्रिस कॉनवे

आप इसे ढूँढ नहीं सकते या आप यह पता नहीं लगा सकते कि इसमें कहाँ नेविगेट करना है? मैं ४.३.१ का उपयोग कर रहा हूं (मुझे लगता है कि यह एक गनीमेड है जिसमें प्यदेव जोड़ा गया है)। यह समस्या टैब के ऊपरी दाएँ हाथ के कोने पर स्थित है जब आप उस टैब के मेनू को नीचे छोड़ने के लिए छोटे तीर आइकन पर क्लिक करते हैं।
ग्रेग

मुझे यहां ढूंढा जा सकता है। मुझे समझ नहीं आ रहा है कि उस डायलॉग में सेटिंग में क्या बदलाव होगा।
क्रिस कॉनवे

मैं देख सकता हूं कि यह कैसे काम कर सकता है, लेकिन फिर आपको काम करने वाले सेट का उपयोग करना होगा, जो एक सामान्य समाधान नहीं है। यह समस्या में जोड़ता है क्योंकि अब आपको सही चेतावनियों को देखने के लिए अपने कार्य सेट को अपडेट करना होगा।
पीटर डॉल्बर्ग

1

मैं यह कुछ ANTLR व्याकरण के लिए कर रहा हूं, जो चींटी का उपयोग करके जावा पार्सर उत्पन्न करता है। चींटी का निर्माण स्क्रिप्ट @SuppressWarnings("all")एक जावा फ़ाइल में, और @Overrideदूसरे में कुछ तरीकों से जोड़ता है । मैं देख सकता हूँ कि यह बिल्कुल कैसे किया जाता है, यदि आप रुचि रखते हैं।


एक दिलचस्प विचार। क्या क्लास की घोषणा से ठीक पहले @SuppressWarnings को आने की जरूरत नहीं है (यानी, यह फ़ाइल की पहली पंक्ति में डालने जितना आसान नहीं है)?
क्रिस कॉनवे

इसे वहां रखा जाना चाहिए, लेकिन यह उल्लेखनीय है। मुझे सही फ़ंक्शन को कठिन खोजने के लिए चींटी प्रलेखन में गहरा गोता लगाने की आवश्यकता थी, लेकिन मुझे चींटी के साथ बहुत अनुभव नहीं है।
जर्न

Antlr.org/wiki/pages/viewpage.action?pageId=1865 देखें जो बताता है कि ANTLR Java कोडजेन टेम्पलेट को कैसे संशोधित किया जाए। हालांकि, यह स्पष्ट नहीं है कि ग्रहण के लिए ANTLR प्लगइन का उपयोग करते समय उस कार्य को कैसे बनाया जाए। मुझे लगता है कि एक को प्लगइन जार को हैक करने या ऊपर सूचीबद्ध अन्य वर्कअराउंड में से एक का उपयोग करने के साथ छोड़ दिया गया है।
djb

1

यह छोटा अजगर स्क्रिप्ट .classpathएम 2 ई -जनरेट की गई फ़ाइलों को "पैच" करता है और आवश्यक 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 2 के मामले @SuppressWarningsमें, व्याकरण फ़ाइल में वर्ग घोषणा से पहले appenidng द्वारा उत्पन्न कोड में चेतावनी को दबाना संभव है , उदा।

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

0

यह बिल्ड पथ से कुछ निर्देशिकाओं को बाहर करके किया जा सकता है (निम्नलिखित उदाहरण ग्रहण 3.5 का उपयोग करके दिया गया है)

[1] जावा बिल्ड पथ को लाएँ

  • प्रोजेक्टिन पैकेज एक्सप्लोरर पर क्लिक करें
  • राइट क्लिक, गुण
  • जावा बिल्ड पाथ चुनें

[२] बाहर करने के लिए निर्देशिकाएं जोड़ें

  • स्रोत टैब में प्रोजेक्ट स्रोत फ़ोल्डर का विवरण होना चाहिए
  • स्रोत फ़ोल्डर का विस्तार करें और 'बहिष्कृत:' गुण का पता लगाएं
  • 'बहिष्कृत:' चुनें और संपादित करें पर क्लिक करें
  • एक से अधिक विकल्प जोड़ें / जोड़ें का उपयोग करके फ़ोल्डर्स को बहिष्करण पैटर्न में जोड़ें
  • समाप्त पर क्लिक करें, फिर पुनर्निर्माण के लिए ग्रहण के लिए ठीक है।

0

मुझे चेतावनी-क्लीनर प्लगइन जारी किए हुए कुछ समय हो गया है, और अब जब मैं ग्रहण 3.8 का उपयोग कर रहा हूं, तो मुझे इसकी कोई आवश्यकता नहीं है। हालांकि, जिन लोगों को अभी भी इस प्लगइन की आवश्यकता है, मैंने इसे जीथब पर अपडेट साइट के साथ बिंट्रे पर जारी किया है। यदि आप अभी भी ग्रहण 3.7 या उससे पहले का उपयोग कर रहे हैं, तो यह उपयोगी हो सकता है। स्थापना विवरण के लिए इस साइट की जाँच करें


0

यदि ग्रहण प्रोजेक्ट ग्रहण प्लगइन के eclipse आदेश का उपयोग करके ग्रेडिंग से उत्पन्न होता है, तो Selectively ignore errors/warnings from source foldersविकल्प आपको build.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फ़ोल्डर में हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.