2012-10-04 4 views
9

보존 정책의 주석에 대한 주석 프로세서가 있습니다. = SOURCE입니다.컴파일 중 주석 프로세서를 스텝 디버그하는 방법은 무엇입니까?

단계별 디버깅 방법을 모르겠습니다.

  • 내가 MVN 설치, 컴파일 또는 패키지 또는 개미 javac의 실행할 때 나는, 로거 정보를 인쇄 문을 발행 한 나는 컴파일 로그에 자신의 sysouts를 참조하십시오.

  • 그러나 이클립스에서 프로세서를 단계별 디버깅하는 방법을 알지 못합니다. 제 말은, 컴파일 타임을 단계별로 디버깅합니까?

답변

5

당신은 디버그 구성을 사용하여 이클립스에서 자바 컴파일러를 호출해야합니다 (당신은 "디버그 구성 ..."메뉴 선택에서 수동 구성을 만들어야합니다.

을 " JDK 1.6 이상에서 Java 컴파일러를 호출하는 올바른 방법은 ToolProvider에서 얻은 javax.tools에있는 JavaCompiler 인터페이스를 사용하는 것입니다 (읽어야하는 클래스/패키지 설명서가 많기 때문에 모든 링크가 포함되어 있습니다).

"빠르며 더러운"방식 (그 이되어야하지만, 아무런 보장도하지 않습니다.) com.sun.tools.javac.Main.main()을 호출하여 일반적인 명령 줄 인수를 전달합니다. 이렇게하려면 클래스 경로에 tools.jar ($JAVA_HOME/lib에 있음)이 필요합니다. 최근에

+0

안녕하세요,이 답변을 수락 한 것으로 읽으면서 문제의 해결책이라고 생각하게 만드십시오. 그런데, "디버그 구성을 사용하여 Eclipse에서 Java 컴파일러를 호출하는 것을 이해하지 못합니다 ("디버그 구성 "에서 수동으로 구성을 작성해야합니다.). 더 잘 설명 할 수 있습니까? thanks – Apperside

+0

기존 프로젝트에 tools.jar 및 프로세서 jar를 추가 한 다음 제안 된대로 com.sun.tools.javac.Main 클래스를 사용했습니다. 클래스 경로에 tools.jar, javac 인수에 Java 응용 프로그램 디버그 구성을 생성했습니다. 프로그램 인수 - 매력처럼 작동했습니다 - 감사합니다! – wbdarby

6

의 옵션 등이

@Test public void testStuff() { 
    // Create a source file to process, or load one from disk. 
    JavaFileObject file = JavaFileObjects.fromSourceLines("test.Foo", 
    "package test;", 
    "", 
    "import bar.*;", 
    "", 
    "@MyAnnotation(blah=false)", 
    "interface TestInterface {", 
    " Bar someBar();", 
    "}", 

    // assert conditions following a compilation in the context of MyProcessor. 
    assert_().about(javaSource()).that(file) 
     .processedWith(new MyProcessor()) 
     .failsToCompile() 
     .withErrorContaining("some error message").in(file).onLine(5); 
} 

이 테스트는 당신을 기대하고, 단계별, 당신은 당신이 브레이크 포인트를 설정할 수 있습니다 임의의 주석 프로세서에 대한 편집 작업을 호출 할 수 있습니다 http://github.com/google/compile-testing 같은 것을 사용하는 것입니다 @MyAnnotation이 테스트 데이터 소스에서 잘못 선언 되었기 때문에 일부 오류 메시지가 표시됩니다. 이 어설 션이 실패하면 IDE에서 디버그 모드로 실행하고 MyProcessor에서 중단 점을 설정 한 다음 디버깅하는 동안 전체 컴파일러 환경을 활성화하여 단계별로 실행할 수 있습니다. 단위 테스트에 대한

구체적인 방법 프로세서 내에서, 당신은 또한 당신이 더 고립 방식으로 컴파일러에서 특정 로직을 테스트하기 위해 요소와 유형의 유틸리티 클래스를 얻을 수있는 CompilationRule라는 @Rule을 사용할 수 있습니다.

2

컴파일 중 주석 처리가 발생하므로 정상적인 디버깅이 작동하지 않습니다. 프로젝트 컨텍스트에서 디버깅하고 싶다면 Eclipse 원격 디버깅을 사용하고 Gradle 또는 Maven을 디버그 모드로 사용할 수 있습니다. 그런 다음 주석 프로세서의 파일에 중단 점을 넣을 수 있습니다.

Debugging an Annotation Processor in any project을 참조하십시오.

면책 조항 : 게시물을 작성했습니다.

관련 문제