2014-10-07 4 views
4

내 코드에서 주석 처리를 수행하기 위해 maven 프로젝트에서 maven-compiler-plugin을 사용하고 있습니다. <fork>true</fork> 구성 옵션을 추가 할 때까지 작동했습니다.fork = true를 지정하면 maven-compiler-plugin이 주석 처리를 수행하지 않습니까?

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.5.1</version> 
    <dependencies> 
    <!-- Add dependency on the annotation processor --> 
    <dependency> 
     <groupId>x.y.z</groupId> 
     <artifactId>my-processor</artifactId> 
     <version>1.0</version> 
    </dependency> 
    </dependencies> 
    <configuration> 
    <source>1.7</source> 
    <target>1.7</target> 
    </configuration> 
</plugin> 

내 프로세서-1.0.jar 파일이 META-INF/서비스/javax.annotation.processing.Processor 포함

의 pom.xml 파일은 다음있다 파일을 컴파일하여 런타임시 javac 컴파일러에서 발견 할 수 있습니다. 나는이 구성 MVN 깨끗한 컴파일을 실행하면

, 나는 예상대로 주석 프로세서가 실행하고, \ 생성 - 소스 \ 그의 주석 대상으로 디렉토리에 코드를 넣어 생성 된 것을 알 수있다. 내가 플러그인 구성에 <fork>true</fork> 옵션을 추가하면

는하지만, 그때 주석 프로세서가 실행되지 않는 것을 관찰하고 어떤 코드는 대상 \ 생성 - 소스 \ 주석 디렉토리에 존재하지 않는다.

maven-compiler-plugin 버전 2.5.1, 3.0 및 3.1 (3.x 버전에서 주석 처리기 병을 발견 할 수 있도록 구성에 <forceJavaCompilerUser>true</forceJavaCompilerUser> 옵션을 추가해야 함)을 시도했습니다. 버전 2.5.1, 3.0,

<configuration> 
    ... 
    <annotationProcessors> 
    <annotationProcessor>x.y.z.MyProcessor</annotationProcessor> 
    </annotationProcessors> 
    ... 
</configuration> 

다시 및 구성 옵션이 분기 지정하지 않은 경우 3.1, 주석 프로세서가 호출 될 것이다 :

는 또한 명시 적으로 주석 프로세서를 지정했습니다. <fork>true</fork> 옵션을 지정하면 주석 프로세서가 실행되지 않습니다.

또한 종속 프로세서 종속성이로드되었는지 확인하기 위해 maven-compiler-plugin 종속성 외부에 x.y.z:my_processor 종속성을 추가했습니다.

maven-compiler-plugin<fork>true</fork>으로 구성된 경우 주석 처리가 여전히 작동해야합니까? 또는 플러그인을 잘못 구성 했습니까?

내가 <fork>true</fork>를 사용하여 주석 처리없이 컴파일하려면 별도의 실행에 컴파일 (예를 들어, 하나 개의 실행을 분할하지 않으 주, 두 번째 실행 이후 <fork>false</fork>을 사용하는 경우에만 할 주석 처리 또 다른 실행은 전체 소스를 다시 컴파일 다시 말하지만,이 문제를 해결할 방법이없는 한, 수천 개의 소스 파일을 다룰 때 좋지 않습니다.)

JDK 1.7.0_45를 사용하고 있습니다.

1

는 사실이 솔루션은 플러그인의 의존성에서 정상 의존성에 프로세서 의존성을 이동하고 편집 번호 : 나는이 테스트했지만 내가 가진 거라고 생각

<dependencies> 
    <dependency> 
    <groupId>x.y.z</groupId> 
    <artifactId>my-processor</artifactId> 
</dependency> 
... 
</dependencies> 

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.5.1</version> 
    <configuration> 
     <source>1.7</source> 
     <target>1.7</target> 
     <fork>true</fork> 
    </configuration> 
    </plugin> 
</plugin> 

생성 된 코드의 존재 여부를 찾는 대신 콘솔 출력 (프로세스가 분기 될 때 나타나지 않음)을 찾고있었습니다.

답변

1

실제로 해결책은 프로세서 의존성을 플러그인의 종속성과 정상적인 종속성으로 옮기는 것이 었습니다. 원래 게시물의 # 1 편집을 참조하십시오.

종속성이 추가 될 때와 종속성이 추가되지 않을 때 컴파일 오류가 발생합니다. 의존성이 없으면 내부 전용 API 사용에 대한 컴파일러 경고가 표시됩니다. 주석 프로세서 종속성이 추가되면 해당 경고는 오류로 처리됩니다. 경고로 오류를 처리하는 컴파일러 옵션에서 -Werror 옵션을 볼 수 없습니다. 주석 프로세서 종속성이 제거되면 컴파일이 경고와 함께 전달됩니다. 이걸로 내 머리를 긁적 ...

+0

이 대답이 정확하다면 – softarn

+0

나는 똑같은 문제가있다 - 필자는 annotation 프로세서 인 JAR (artifact ** apt **) = 플러그인 (Artifact ** apt-plugin **의 Mojo)에서 사용한다. 이 주석 처리기를 사용하여 Javac 도구를 실행하기 만하면됩니다. 나는 프로젝트 X에서 그것을 사용한다. ** apt **에 대한 의존성이 프로젝트 의존성에있을 때, 괜찮다. 그러나 플러그인에서'종속/의존성'을 사용하면 효과가 없습니다. Maven 모델은'plugin'의'dependencies'는 ... "이 프로젝트가 플러그인의 클래스 로더에 추가해야하는 추가 의존성입니다." 하지만 플러그인을 디버깅 할 때 모든 프로젝트에 내 의존성을 제공하지 않습니다 .get ... – virgo47

1

compilerArgs 옵션을 사용하면 maven에서 분기 모드로 호출 할 때 -processor 옵션을 javac에 전달할 수 있습니다.

+0

고마워 ... 사실 해결책은 'maven-compiler-plugin'섹션과 'dependencies'섹션에서 프로세서 종속성을 이동해야합니다. '-processor'옵션은 다른 효과가 없습니다. –

+0

아 좋아. 이를 공식 답변으로 사용하고 동일한 이슈를 가진 사람이 쉽게 솔루션을 찾을 수 있도록 허용 할 수 있습니다 (http://stackoverflow.com/help/self-answer). – DB5