【问题标题】:Setting the generated source directory for annotation processors in Maven在 Maven 中为注释处理器设置生成的源目录
【发布时间】:2010-12-07 23:10:02
【问题描述】:

我正在尝试将使用注释处理器生成源的构建移动到 Maven。我尝试如下配置 maven-compiler-plugin:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <compilerArgument>-s ${project.build.directory}/target/generated-sources/annotation-processing</compilerArgument>
            </configuration>
        </plugin>
    </plugins>

但是 javac 失败了

[INFO] Compilation failure  
Failure executing javac,  but could not parse the error:
javac: invalid flag: -s /home/robert/workspaces/betbrain/sportsengine.common/sportsengine.bean.test/target/target/generated-sources/annotation-processing  
Usage: javac <options> <source files>  
use -help for a list of possible options

据我所知,-s 应该在源文件之前传递给 javac,但 maven 在之后传递。

如何将-s 标志正确地传递给maven-compiler-plugin?


更新maven-annotation-plugin 似乎不起作用。

当配置为

        <plugin>
            <groupId>org.bsc.maven</groupId>
            <artifactId>maven-processor-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <id>process</id>
                    <goals>
                        <goal>process</goal>
                    </goals>
                    <phase>generate-sources</phase>
                    <configuration>
                        <outputDirectory>${generated.sources.directory}</outputDirectory>
                        <processors>
                            <processor>xxx.annotation.EnforceJavaBeansConventionsProcessor</processor>
                        </processors>
                    </configuration>
                </execution>
            </executions>
        </plugin>

执行失败

[INFO] [processor:process {execution: process}]
error: Annotation processor 'xxx.annotation.EnforceJavaBeansConventionsProcessor' not found
1 error

【问题讨论】:

  • 感谢提到 maven-annotation-plugin。它对我有用。

标签: java maven maven-2 annotation-processing


【解决方案1】:

不完全是您问题的答案,但很有趣:

https://issues.apache.org/jira/browse/MCOMPILER-75

恐怕在 Maven 中使用 JSR 269 会出现很多问题,至少在使用默认编译器插件时是这样。

【讨论】:

  • 使用 maven-compiler-plugin 2.2,您不需要做任何事情来获取 269 来发现默认处理器。
【解决方案2】:

我在 GWTP 源生成 APT 处理注释方面遇到了这个问题

是因为我没有设置编译插件的版本,我的最终设置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.0</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <!-- <compilerArgument>-proc:none</compilerArgument> -->
        <generatedSourcesDirectory>${generated.sources}</generatedSourcesDirectory>
        <annotationProcessors>
            <annotationProcessor>com.gwtplatform.dispatch.annotation.processor.GenEventProcessor</annotationProcessor>
            <annotationProcessor>com.gwtplatform.dispatch.annotation.processor.GenDtoProcessor</annotationProcessor>
            <annotationProcessor>com.gwtplatform.dispatch.annotation.processor.GenDispatchProcessor</annotationProcessor>
        </annotationProcessors>
    </configuration>
</plugin>

【讨论】:

    【解决方案3】:

    我一直使用maven-processor-plugin如下:

    <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <version>2.2.4</version>
        <executions>
          <execution>
            <id>process-my-annotations</id>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-test-sources</phase>
            <configuration>
              <processors>
                <processor>x.y.z.MyAnnotationProcessor</processor>
              </processors>
              <outputDirectory>${project.build.directory}/generated-test-sources/test-annotations</outputDirectory>
              <outputClassDirectory>${project.build.directory}/test-classes</outputClassDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
    

    生成的代码进入target/generated-test-sources/test-annotations,生成的资源进入target/test-classesprocess 目标分别是 target/generated-sourcestarget/classes)。

    我还需要使用 maven-build-helper-plugintarget/generated-test-sources/test-annotations 添加到测试源路径,以便 test-compile 阶段编译生成的代码。

    【讨论】:

      【解决方案4】:

      我可能遗漏了一些东西,但你不应该:

      1. generate-sources 阶段在target/generated-sources/annotation-processing 中生成源? apt-maven-pluginmaven-annotation-plugin 可能会有所帮助。

      2. maven-compiler-pluginmaven-build-helper-plugin 中使用&lt;includes&gt; 将源编译成target/classes 时包含生成的源?

      编辑:xxx.annotation.EnforceJavaBeansConventionsProcessor 在哪里?您不需要将dependencies 添加到Usage 页面上记录的maven-annotation-plugin 的配置中吗?

      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <executions>
          <execution>
            <id>process</id>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <outputDirectory>src/main/generated</outputDirectory><!-- PROCESSOR OUT DIR --> 
              <processors><!-- LIST OF PROCESSOR CLASS(S) -->
                <processor>org.bsc.apt.BeanInfoAnnotationProcessor</processor>
              </processors>
            </configuration> 
          </execution>
        </executions>
        <dependencies/><!-- ADD DEPENDENCIES HERE IF REQUIRED -->
      </plugin>
      

      PS:我不会使用src/main/generated 作为输出目录,而是使用target/generated-sources 的子目录。

      【讨论】:

      • 是的,我应该。我应该如何执行第 1 步?
      • 你使用maven-apt-plugin还是maven-annotation-plugin?
      • 我现在正在研究 maven-annotation-plugin - 因为我使用的是 Java 6 API,但显然我需要列出我正在使用的处理器,我无法通过那些正确的。是否可以将 maven-compiler-plugin 绑定到 generate-sources 阶段?
      【解决方案5】:

      我遇到了同样的问题...


      [ERROR] COMPILATION ERROR :
      
      [INFO] -------------------------------------------------------------
      
      [ERROR] Failure executing javac, but could not parse the error:
      
      javac: invalid flag: -s
      ...
      

      你在用 java 5 吗?

      $ mvn -version
      
      Apache Maven 2.2.1 (rdebian-8)
      
      Java version: 1.5.0_22
      
      Java home: /usr/lib/jvm/java-1.5.0-sun-1.5.0.22/jre
      
      Default locale: en_US, platform encoding: UTF-8
      
      OS name: "linux" version: "3.2.0-24-generic" arch: "amd64" Family: "unix"
      
      $ which java
      /usr/bin/java
      
      $ ll /usr/bin/java
      /usr/bin/java -> /etc/alternatives/java*
      
      $ ll /etc/alternatives/java
      /etc/alternatives/java -> /usr/lib/jvm/java-1.5.0-sun/jre/bin/java*
      

      $ sudo update-alternatives --config java
      
      
      
      $ mvn -version
      
      Apache Maven 2.2.1 (rdebian-8)
      
      Java version: 1.6.0_24
      
      Java home: /usr/lib/jvm/java-6-openjdk-amd64/jre
      
      Default locale: en_US, platform encoding: UTF-8
      
      OS name: "linux" version: "3.2.0-24-generic" arch: "amd64" Family: "unix"
      

      现在,mvn install 应该可以工作了 :-)

      【讨论】:

        【解决方案6】:

        其中一个原因可能是 $JAVA_HOME 指向 jdk 1.5 版本而不是 1.6。 (当然在 Windows 上检查 %JAVA_HOME%)

        【讨论】:

          【解决方案7】:

          插件使用硬编码的 Windows 类路径分隔符来构建类路径,所以它在我的 Linux 机器上失败了。

          提交的补丁:

          【讨论】:

          • 很高兴知道。感谢您的补丁:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 2016-03-22
          • 2020-10-14
          • 1970-01-01
          相关资源
          最近更新 更多