如何让注解处理器生成的文件支持Maven资源过滤替换版本变量
解决注解处理器生成文件的Maven版本变量替换问题
我之前也碰到过类似的场景,注解处理器生成的文件没法直接用Maven默认的资源过滤,得稍微调整下配置,下面是具体的实现步骤:
1. 配置maven-resources-plugin处理生成的文件目录
首先,你需要让Maven的资源插件去处理注解处理器生成文件所在的目录。通常注解处理器会把生成的文件放到target/generated-sources/annotations或者自定义目录里,你可以在pom.xml的build/plugins里添加如下配置:
<build> <finalName>prodity-commons-spigot</finalName> <sourceDirectory>src/main/java</sourceDirectory> <!-- 保留你原有的其他配置 --> <plugins> <!-- 配置资源插件处理生成目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>process-generated-resources</id> <phase>process-classes</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <!-- 输出到编译后的类目录,确保最终能打进JAR --> <outputDirectory>${project.build.outputDirectory}</outputDirectory> <resources> <resource> <!-- 替换成你注解处理器实际生成文件的目录 --> <directory>${project.build.directory}/generated-sources/annotations</directory> <!-- 开启变量过滤替换 --> <filtering>true</filtering> <!-- 指定要处理的文件类型,按需调整 --> <includes> <include>*.*</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <!-- 保留你原有的其他插件配置 --> </plugins> </build>
这里的核心要点:
- 指定
phase为process-classes,确保在注解处理器生成文件之后执行替换操作 - 开启
<filtering>true</filtering>来启用Maven的变量替换机制 - 源目录必须和你注解处理器生成文件的实际路径一致,如果生成到
target/generated-resources这类目录,直接修改即可
2. 可选:将生成目录添加为Maven资源目录
如果你的注解处理器生成的是纯资源文件(而非Java源文件),可以把生成目录直接加入到Maven的资源目录列表中,让默认的资源处理流程覆盖它:
<build> <!-- 保留你原有的其他配置 --> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> <!-- 添加生成目录作为资源目录 --> <resource> <directory>${project.build.directory}/generated-sources/annotations</directory> <filtering>true</filtering> </resource> </resources> </build>
这种方式要注意执行顺序,确保Maven处理资源时,注解处理器已经生成了目标文件。
3. 验证替换效果
配置完成后,执行mvn clean package命令,然后打开编译后的JAR包,查看目标文件里的${project.version}是否已经被替换成了项目的实际版本号。
另外要注意:只要注解处理器生成的文件里是直接写入${project.version}字符串,Maven的过滤机制就能自动识别并替换,不需要修改注解处理器的代码逻辑。
内容的提问来源于stack exchange,提问作者C_Neth
相关产品推荐
相关产品推荐

