2016-07-13 4 views
3

다른 모듈에서 사용하는 커스텀 어노테이션에 대한 몇 가지 애노테이션 프로세서가 모듈 중 하나에 포함 된 멀티 모듈 기반 프로젝트에서 작업하고 있습니다. 주석 프로세서 모듈의 종속성을 다른 모듈에 추가 할 때 해당 모듈의 주석은 해당 주석 프로세서에서 처리됩니다.Checker Framework와 함께 커스터마이징 어노테이션 프로세서 사용하기

하지만 최근에 Checker Framework (유형 주석)을 통합 한 다음 위에서 언급 한 모든 맞춤 주석 프로세서 (위에서 언급 한)가 작동을 멈췄습니다. Checker Framework로 작업하는 방법에 대한 아이디어는 대단히 감사하게 생각하니?


이의 내가 module_A라는 받는다는 모듈이 있다고 가정 해 봅시다, 시나리오를 취소합니다. 이 모듈에는 "@FoodItem"이라는 주석 (클래스 수준)이 있습니다. "@FoodItem"주석을 사용하여 주석을 추가 한 클래스가 인터페이스 "Food"를 구현해야한다는 규칙을 시행해야합니다. 그래서 같은 클래스를 처리하고 그 규칙을 준수하는지 검사하는 동일한 모듈 (module_A)에 주석 처리기 "FoodItemAnnotationProcessor"를 작성했습니다.

그럼 module_A에 대한 maven 종속성이있는 module_B라는 다른 모듈이 있다고 가정 해 보겠습니다. 이 모듈에는 "@FoodItem"주석이 주석 처리 된 "Pizza"라는 클래스가 있습니다.

위의 구성으로 프로젝트 (module_A 및 module_B 포함)를 빌드하는 경우 "FoodItemAnnotationProcessor"가 컴파일 단계에서 실행되고 위에서 언급 한 규칙에 대해 "피자"클래스의 유효성을 검사합니다.

그 후 나는 checker 프레임 워크를 module_B (here)에 통합했습니다. 그런 다음 검사기 프레임 워크 관련 유효성 검사가 컴파일 타임에 예상대로 실행되지만 "FoodItemAnnotationProcessor"는 작동하지 않습니다.

+0

설치에 대한 자세한 내용을 설명해 주시겠습니까? – mernst

+0

시나리오에 대한 설명 추가 –

+0

참조하는 단계 3의 지침에는 ''주석이있는 코드 스 니펫이 포함됩니다. FoodItemAnnotationProcessor를 거기에 포함 시켰습니까? – mernst

답변

0

javac이 주석 처리기를 찾는 방법을 알아야합니다. 당신이 javac의에 대한 --processor 인수 (doc-javac-options 참조), 다음 주석 프로세서 자동 검색 기능을 (javac-doc: Annotation processing 참조) 제공하지

활성화됩니다. 즉, javac는 classpath (또는 지정한 경우 processorpath)에있는 사용 가능한 모든 주석 프로세서를 검색합니다.
META-INF/services/javax.annotation.processing.Processor 파일을 포함하는 Jars는 주석 처리기 클래스를 지정할 수 있으며 javac는이를 자동으로 사용합니다.

checker-framework에 검사를위한 다중 주석 처리기가 있지만 "주석 검색 프로세스를 사용할 수 없으며 모든 주석을 수동으로 지정해야합니다" 프로세서를 빌드 파일에서 실행할 수 있습니다. 메이븐에 대한

당신이 이런 식으로 작업을 수행 할 수 있습니다 구축이 명시 적으로 기본 주석 - 검색 프로세스를 비활성화 javac의에 대한 --processor 인수를 ( doc-javac-options 참조) 설정합니다 checker-framework doc for Maven

<annotationProcessors> 
    <!-- Add all the checkers you want to enable here --> 
    <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor> 
</annotationProcessors> 

.

그래서 해결 방법은 검사기 프레임 워크 검사기 외에도 실행하려는 모든 주석 프로세서를 수동으로 추가하는 것입니다.

예.,
현재 사용되는 주석 프로세서를 찾아 빌드를 실행하고 javac의에 비표준 옵션 -XprintProcessorInfo을 통과 :

<annotationProcessors> 
    <!-- Add all the checkers you want to enable here --> 
    <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor> 
    <!-- Add all your other annotation processors here --> 
    <annotationProcessor>dagger.internal.codegen.ComponentProcessor</annotationProcessor> 
</annotationProcessors> 

힌트 : 당신이 NullnessCheckerDagger을 실행하고자 할 때, 당신은 모두 지정해야합니다 .

UPDATE :

검수원은 또한 자동 검색 (doc-ref) 어떤 종류의 지원은 - 참고 : 난 아직 사용하지 않았습니다.

2.2.3 검사기 자동 검색은

은 "자동 검색"는 명시 적으로 -processor 명령 줄 옵션을 통과하지 못한 경우에도 javac 컴파일러는 항상 검사기 플러그인, 를 실행합니다. 이렇게하면 명령 줄을 더 짧게 만들 수 있으며 명령 줄 옵션을 잊어 버린 경우에도 코드가 확인됩니다.

자동 검색을 사용하려면 클래스 경로에 META-INF/services/javax.annotation.processing.Processor라는 구성 파일을 배치하십시오. 파일에는 이 사용되는 체커 플러그인 이름이 한 줄에 하나씩 들어 있습니다. 예를 들어, 자동으로 Nullness 검사 과 인턴 검사기를 실행하려면, 구성 파일은 이 포함되어 있어야합니다

org.checkerframework.checker.nullness.NullnessChecker
org.checkerframework.checker.interning.InterningChecker