생성 된 코드와 같은 특정 디렉토리 또는 파일에 대한 Java 경고를 억제하는 방법


110

다소 못생긴 코드를 생성하는 파서 생성기를 사용하고 있습니다. 결과적으로 내 Eclipse 프로젝트에는 생성 된 소스 파일에서 발생하는 수십 개의 경고가 있습니다. @SuppressWarning주석을 사용하여 특정 요소의 특정 경고를 억제 할 수 있다는 것을 알고 있지만 수동으로 추가 한 주석은 파서 생성기가 다시 실행될 때 손실됩니다. 특정 파일 또는 디렉토리에 대한 경고를 억제하도록 Eclipse를 구성하는 방법이 있습니까?


답변:


91

버전 3.8 M6부터 Eclipse (정확히 말하자면 JDT)에는이를위한 기능이 내장되어 있습니다. 프로젝트의 빌드 경로를 통해 구성 할 수 있습니다. 프로젝트 속성> Java 빌드 경로> 컴파일러> 소스

여기에 이미지 설명 입력

여기에 발표 : Eclipse 3.8 및 4.2 M6-New and Noteworthy , 소스 폴더의 오류 / 경고를 선택적으로 무시합니다 . 또한 스크린 샷의 출처이기도합니다. 이것은 이전에 링크 된 Bug 220928 에서 개발 된 새로운 기능입니다 .


2
> "예"... 그것의 "전환"버튼 (그리고 편집 또는 뭔가 다른) ;-) - 나는 "아니오"로 전환하는 방법을 찾을 수 없습니다
Betlista

@Betlista : 더블 클릭하면됩니다. 또는 오른쪽에있는 전환 버튼을 클릭합니다.
altumano

1
@hheimbuerger :이 솔루션은 소스 폴더에서만 작동합니다. 그러나 잘못된 XML 파일이 포함 된 프로젝트에 폴더가 있으면 어떻게됩니까? 나는 그들에 대한 경고를보기 싫어 :(
altumano

@altumano 위의 기능 / 옵션은 JDT 플러그인, 즉 Eclipse에 대한 Java 지원에서 비롯됩니다. (Eclipse의 거의 모든 것이 플러그인이라는 것을 기억하십시오. 심지어 Java 지원도 포함되지 않았습니다.) 따라서 XML 유효성 검사를 수행하는 데 사용하는 플러그인의 개발자에게 다시 확인해야합니다. IIRC에는 수많은 항목이 있으므로 사용중인 질문에 대한 새 질문을 열어야합니다.
Henrik Heimbuerger 2011

+1. 그런데 어떤 OS를 사용 하셨나요? 글꼴 렌더링은 매우 이상합니다.
표시 이름

20

이것에 대한 티켓이 있습니다, Bug 220928이클립스 3.8 용으로 완료된 있습니다. 자세한 내용은 이 답변 을 참조하십시오.

Eclipse 3.7 이하를 사용하는 경우 : 해당 티켓에 대한 사용자 "Marc"가 다음에서 'warningcleaner'라는 플러그인을 만들었습니다 (또는 적어도 링크). 댓글 35 . 이 기능이 Eclipse에 통합되기를 기다리는 동안 많은 성공을 거두었습니다.

정말 간단합니다.

  1. 플러그인을 설치합니다.
  2. 프로젝트를 마우스 오른쪽 단추로 클릭하고 "생성 된 코드 특성 추가 / 제거"를 선택하십시오.
  3. 프로젝트 설정을 엽니 다 (마우스 오른쪽 버튼을 클릭하고 "속성"선택).
  4. '경고 클리너'탭을 엽니 다.
  5. 경고를 무시할 소스 폴더를 선택하십시오.

경고 클리너 스크린 샷


불행히도 플러그인에 대한 링크는 지금 403을 제공합니다
Kutzi

1
핵심 구현을 향한 진전이 아직 진행중인 것 같습니다 (버그에 대한 의견 읽기). 기능이 구현 된 경우 특정 버전 번호를 사용하도록 질문 / 답변을 업데이트해야합니다. 그렇지 않으면 향후 Eclipse 사용자가 혼란 스러울 수 있습니다.
Chris Browne

1
기능이 아직 존재하지 않았기 때문에 질문 / 답변이 현재 개선 될 수 있다고 생각하지 않지만 기능이 eclipse에 추가 된 경우 누군가 이것을 편집해야합니다. 꼭 저는 아니지만 적시에 적절한 장소에 있다면 당연히 그렇게 할 것입니다.
Chris Browne

5
누구든지이 플러그인에 대한 현재 링크가 있습니까? 나는 그것을 사용할 수 있으면 좋겠다!
Tom Tresansky

1
주의 : hheimbuerger의 다른 답변에서 볼 수 있듯이 Eclipse에는 이제 이에 대한 내장 솔루션이 있습니다. 그건 그렇고, hheimbuerger, 업데이트 된 정보 로이 답변을 리팩토링하여 '공식'으로 만들어야합니다.
Roberto

18

maven regexp replace 플러그인을 사용하여이 문제를 해결했습니다. 원인은 해결되지 않지만 고통은 치유됩니다.

<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이 언급되지 않았기 때문에 이것이 반드시 질문에 대한 답은 아닙니다. 내가 메이븐을 사용하지만 그것은 ;-), 내 경우에는 잘 작동
Kutzi

Maven 대신 Ant를 사용하는 경우에도 동일한 작업을 수행 할 수 있습니다. 내 대답을 참조하십시오.
Jorn

1
ANTLR 3.4가 자체적으로 주석을 추가하는 것 같지만 솔루션의 일반성이 마음에 듭니다 (ANTLR이 코드를 생성 할뿐만 아니라). 생성 된 모든 소스에 계속 적용하기 위해 다음 패턴을 사용합니다 ^(@SuppressWarnings\(.*?\)\s+)?public class.. 패턴에 주석을 포함하면 이미있는 경우 복제되지 않습니다.
Silly Freak 2011

이것은 (어느 정도) 저에게 효과적 이었습니다. ${basedir}/전 태그 에 추가 해야 target했습니다 <include>. 약간 버벅 거림 느낌이 들지만 생성 된 파일에서만 작동하므로 가져갈 게요!
Rob

7

나는 당신이 할 수있는 최선의 방법은 경고를 표시하기 위해 프로젝트 특정 설정을 활성화하는 것입니다.

창-> 환경 설정-> Java-> 컴파일러-> 오류 / 경고

양식 상단에는 프로젝트 별 설정을 구성하기위한 링크가 있습니다.


4

사용자 @Jorn은이를 수행하기 위해 Ant 코드에서 암시했습니다. 여기에 내가 가진 것

<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의 <replace>는 정규식 대체가 아닌 텍스트 대체를 수행하므로 maven regexp replace 플러그인과 같이 토큰의 ^ 메타 문자를 사용하여 줄의 시작 부분을 일치시킬 수 없습니다.

ANTLR maven 플러그인이 Cobertura maven 플러그인과 잘 작동하지 않았기 때문에 Maven pom의 maven-antrun-plugin에서 Antlr를 실행하는 동시에이 작업을 수행하고 있습니다.

(나는 이것이 원래 질문에 대한 대답이 아니라는 것을 알고 있지만 주석 / 다른 대답에 대한 답변에서 Ant 코드를 형식화 할 수는 없으며 대답에서만)


1

Eclipse가 본질적으로 디렉토리 수준에서이 작업을 수행하는 방법을 제공한다고 생각하지 않습니다 (하지만 확실하지 않습니다).

생성 된 파일을 별도의 Java 프로젝트로 이동하고 해당 특정 프로젝트에 대한 경고를 제어 할 수 있습니다.

나는 일반적으로 자동 생성 코드를 별도의 프로젝트에 배치하는 것을 선호합니다.


1

프로젝트 수준에서만 경고를 억제 할 수 있습니다. 그러나 파일 또는 패키지에서 경고를 표시하지 않도록 문제 탭을 구성 할 수 있습니다. 컨텐츠 구성 메뉴로 이동하여 "작업 세트 :"범위로 작업하십시오.


콘텐츠 구성 메뉴가 이해가되지 않습니다.
Chris Conway

찾을 수 없거나 탐색 할 위치를 알 수 없습니까? Eclipse 3.4.1을 사용하고 있습니다 (PyDev가 추가 된 Ganymede 설치라고 생각합니다). 작은 화살표 아이콘을 클릭하여 해당 탭의 메뉴를 드롭 다운하면 문제 탭의 오른쪽 상단에 있습니다.
Greg

찾을 수 있습니다. 해당 대화 상자에서 설정을 변경하면 어떤 효과가 있는지 이해할 수 없습니다.
Chris Conway

이것이 어떻게 작동하는지 알 수는 있지만 일반적인 솔루션이 아닌 작업 세트를 사용해야합니다. 이제 올바른 경고를 보려면 작업 세트를 업데이트해야하므로 문제가 추가됩니다.
Peter Dolberg 2012 년

1

이 작은 Python 스크립트는 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

Ant를 사용하여 Java 파서를 생성하는 몇 가지 ANTLR 문법에 대해이 작업을 수행하고 있습니다. Ant 빌드 스크립트는 @SuppressWarnings("all")을 하나의 Java 파일에 추가하고 다른 파일 @Override의 몇 가지 메소드에 추가합니다. 관심이 있으시면 정확히 어떻게되었는지 찾아 볼 수 있습니다.


흥미로운 아이디어입니다. @SuppressWarnings는 클래스 선언 바로 앞에 올 필요가 없습니까 (즉, 파일의 첫 번째 줄에 삽입하는 것만 큼 쉽지 않습니다)?
Chris Conway

거기에 둘 필요는 없지만 가능합니다. 올바른 기능을 찾기 위해 ant 문서를 깊이 파고 들어야했지만 Ant에 대한 경험이 많지 않습니다.
Jorn

ANTLR Java codegen 템플릿을 수정하는 방법을 설명하는 antlr.org/wiki/pages/viewpage.action?pageId=1865 를 참조하십시오 . 그러나 Eclipse 용 ANTLR 플러그인을 사용할 때 작동하도록하는 방법은 명확하지 않습니다. 플러그인 항아리를 해킹하거나 위에 나열된 다른 해결 방법 중 하나를 사용하여 남은 것 같습니다.
djb

0

ANTLR 2의 경우 @SuppressWarnings문법 파일에서 클래스 선언 전에 appenidng에 의해 생성 된 코드에서 경고를 억제 할 수 있습니다.

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

0

이것은 빌드 경로에서 특정 디렉토리를 제외하여 수행 할 수 있습니다 (다음 예제는 Eclipse 3.5를 사용하여 제공됨).

[1] Java 빌드 경로 가져 오기

  • 패키지 탐색기에서 프로젝트를 클릭하십시오.
  • 오른쪽 클릭, 속성
  • Java 빌드 경로 선택

[2] 제외 할 디렉토리 추가

  • 소스 탭에는 프로젝트 소스 폴더의 세부 사항이 포함되어야합니다.
  • 소스 폴더를 확장하고 '제외됨 :'속성을 찾습니다.
  • '제외됨 :'을 선택하고 수정을 클릭합니다.
  • 여러 항목 추가 / 추가 옵션을 사용하여 제외 패턴에 폴더 추가
  • 완료를 클릭 한 다음 Eclipse를 다시 빌드하려면 확인을 클릭하십시오.

0

경고 클리너 플러그인을 출시 한 지 오래되었고 이제 Eclipse 3.8을 사용하고 있으므로 더 이상 필요하지 않습니다. 그러나 여전히이 플러그인이 필요한 사람들을 위해 bintray의 업데이트 사이트와 함께 github에 릴리스했습니다. Eclipse 3.7 또는 이전 버전을 사용하는 경우 유용 할 수 있습니다. 설치 세부 사항은 이 사이트 를 확인 하십시오.


0

Eclipse 플러그인의 eclipse 명령을 사용하여 gradle에서 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폴더에 있다고 가정 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.