2014-10-07 202 views
4

我在maven项目中使用maven-compiler-plugin来对我的代码执行注释处理。它一直在工作,直到我添加了一个<fork>true</fork>配置选项。指定fork = true时,maven-compiler-plugin不会执行注释处理?

的pom.xml文件有以下几点:

<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文件,以便在运行时由javac编译器发现它。

当运行MVN清洁编译利用该配置,我看到注解处理器运行,并生成码被放入目标\产生来源\注解目录,如所预期。

但是,如果我添加<fork>true</fork>选项插件配置,然后我观察到注解处理器不运行并且没有代码存在于目标\产生来源\注解目录。

我试过这个与maven-compiler-plugin版本2.5.1,3.0和3.1(与3.x版本我不得不添加一个<forceJavaCompilerUser>true</forceJavaCompilerUser>选项的配置,使注释处理器jar将被发现)。

我也试过明确指定注解处理器:

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

再次,对于2.5.1版本,3.0和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 2014-12-22 12:46:26

+0

我有同样的问题 - 我有一个JAR(artifact ** apt **)=我的注释处理器,我在插件中使用它(Mojo在artifact ** apt-plugin **中)它仅使用此注释处理器运行Javac工具。我在项目X中使用它。当** apt **的依赖项在项目依赖项中时,它是可以的。但是,当我在插件'depencies/dependency'中使用它时,它不起作用。 Maven模型说''plugin'中的'dependencies'是......“这个项目需要引入插件类加载器的其他依赖项。”但是,当我调试插件,它不提供我的依赖任何project.get ... – virgo47 2015-09-14 11:39:18

1

您需要使用compilerArgs选项将-processor选项传递给javac,当它由maven以分叉模式调用时。

+0

谢谢...实际上,解决方案需要将处理器依赖从'maven-compiler-plugin'部分移出到'依赖关系'部分。否则,'处理器'选项无效。 – 2014-10-07 23:24:03

+0

啊好的。您可能想将其作为正式答案并接受,以便任何具有相同问题的人都可以轻松找到解决方案(http://stackoverflow.com/help/self-answer)。 – DB5 2014-10-08 06:56:15