需要来自生成源阶段的src / main / resources文件,用于注释处理器配置

时间:2014-09-03 13:41:31

标签: java maven classpath config annotation-processing

我有一个注释处理器,我需要提供一些配置来告诉它一些关于我希望它如何生成源代码的细节。我花了很多时间试图理解为什么文件在构建之后就位于目标/类中,但是我在注释处理期间得到了一个异常,说明文件实际上并不存在。

经过大量挖掘后,我终于找到了为什么文件(存储在src/main/resources/config中)没有被复制到target/classes/config以便我的注释处理器读取 - generate-sources发生在{process-resources之前1}}在构建生命周期中,因此文件不会及时复制,以便注释处理器在运行期间查看它。 (maven build lifecycle reference:http://maven.apache.org/ref/3.2.2/maven-core/lifecycles.html

以下是我正在尝试做的高级概述:

我有一个我已经构建的jar,它处理注释并从注释中的信息生成接口类,以使客户端api基于。我们的想法是,将该jar作为编译时依赖项包含在内,应该为使用这些注释的任何项目自动生成此代码(在客户端项目的pom.xml中尽可能少的附加配置)。

我如何去做:

  1. 获取(至少)在generate-sources
  2. 之前发生的进程资源的config.xml部分
  3. 以其他方式将文件添加到注释处理器的类路径中(我们在输出存档中不需要此文件,因此这可能更好)
  4. 如果有更好的方式我没有想到,我也愿意接受其他(干净的)将配置信息输入注释处理器的方法
  5. 如果可能的话,我宁愿不为此编写一个完整的maven插件。

    编辑: 以下是每个请求的客户端pom <build>部分的相关部分:

    <build>
        <finalName>OurApp</finalName>
        <resources>
            <resource>
                <!-- My config.xml file is located here -->
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>src/main/webapp</directory>
                <includes>
                    <include>*.*</include>
                </includes>
                <excludes><exclude>${project.build.directory}/generated-sources/**</exclude></excludes>
            </resource>
        </resources>
        <plugins>
            <!-- Omit Annotation Processor lib from the compilation phase because the code generated is destined for another, separate jar -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <executions>
                  <execution>
                    <id>annotation-processing</id>
                    <phase>generate-sources</phase>
                    <goals>
                      <goal>compile</goal>
                    </goals>
                    <configuration>
                      <proc>only</proc>
                    </configuration>
                  </execution>
                  <!-- Compile the rest of the code in the normal compile phase -->
                  <execution>
                    <id>compile-without-generated-source</id>
                    <phase>compile</phase>
                    <goals>
                      <goal>compile</goal>
                    </goals>
                    <configuration>
                      <excludes><exclude>${project.build.directory}/generated-sources/**</exclude></excludes>
                      <proc>none</proc>
                      <!-- http://jira.codehaus.org/browse/MCOMPILER-230 because this doesn't
                           work in the opposite direction (setting failOnError in the other execution 
                           and leaving the default top-level value alone) -->
                      <failOnError>true</failOnError>
                    </configuration>
                  </execution>
                </executions>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <proc>only</proc>
                    <failOnError>false</failOnError>
                </configuration>
            </plugin>
            <!-- package generated client into its own SOURCE jar -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>generated-client-source</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.package</groupId>
                        <artifactId>our-api</artifactId>
                        <version>${our-api.version}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>client-source</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

1 个答案:

答案 0 :(得分:1)

因为这个文件只在编译时需要,并且由于任何直接从类路径中绘制它的尝试都失败了,所以我决定将它放在项目根目录中,并在Maven中添加一个编译器参数指向文件。

  <compilerArgs>
      <compilerArg>-AconfigFilePath=${project.basedir}/config.xml</compilerArg>
  </compilerArgs>

不如自动从类路径中获取它那么优雅,但仍然比将所有配置元素作为单独的属性提供更好。

感谢您的建议