使用templating-maven-plugin时如何处理构建路径源问题
我正从Ivy+Ant迁移到Maven,对Maven还比较陌生。需要过滤一个包含@@replaceme@@占位符的.java源文件,编译结果后打包成JAR。已使用org.codehaus.mojo:templating-maven-plugin完成源文件过滤,插件将生成的源文件输出到${project.build.directory}/generated-sources/java-templates,编译和打包流程正常。但在Eclipse中,构建路径指向该生成目录,而我希望原agent/src作为主要构建路径源;若将agent/src添加到POM使其在IDE中可见,编译会出现重复类错误。
当前POM相关配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>templating-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>filter-src</id> <phase>generate-sources</phase> <goals> <goal>filter-sources</goal> </goals> <configuration> <delimiters>@@</delimiters> <overwrite>true</overwrite> <sourceDirectory>agent/src</sourceDirectory> <outputDirectory>${project.build.directory}/generated-sources/java-templates</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <id>add-sources</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>loader/src</source> <!--<source>agent/src</source> duplicate class -errors with this--> </sources> </configuration> </execution> <execution> <id>add-test-sources</id> <phase>generate-test-sources</phase> <goals> <goal>add-test-source</goal> </goals> <configuration> <sources> <source>test/src</source> </sources> </configuration> </execution> </executions> </plugin>
方法1:分离模板文件与源码目录(推荐,符合Maven规范)
核心思路是把带占位符的模板文件和最终源码目录分开,从根源避免编译冲突:
- 在项目中新建
agent/templates目录,将agent/src下所有带@@占位符的.java文件移到这个新目录。 - 修改
templating-maven-plugin的模板源目录为agent/templates:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>templating-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>filter-src</id> <phase>generate-sources</phase> <goals> <goal>filter-sources</goal> </goals> <configuration> <delimiters>@@</delimiters> <overwrite>true</overwrite> <sourceDirectory>agent/templates</sourceDirectory> <!-- 指向模板目录 --> <outputDirectory>${project.build.directory}/generated-sources/java-templates</outputDirectory> </configuration> </execution> </executions> </plugin>
- 现在可以安全地把
agent/src添加到build-helper-maven-plugin的源码路径中,IDE会将其识别为可编辑的源码目录,且不会和生成目录的类冲突:
<execution> <id>add-sources</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>loader/src</source> <source>agent/src</source> <!-- 取消注释添加 --> </sources> </configuration> </execution>
方法2:让agent/src在IDE可见但不参与编译
如果不想调整目录结构,可以通过Maven配置让Eclipse识别agent/src为源文件夹,但排除其java文件的编译:
添加maven-eclipse-plugin配置,统一管理IDE的构建路径:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.10</version> <configuration> <classpath> <sources> <!-- 将agent/src加入IDE源路径,但排除java文件编译 --> <source> <directory>agent/src</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </source> </sources> </classpath> </configuration> </plugin>
执行mvn eclipse:eclipse更新IDE配置后,agent/src会在Eclipse中显示为源文件夹,你可以正常编辑其中的模板文件,但编译时只会处理生成目录generated-sources/java-templates里的文件,不会出现重复类错误。
方法3:标记agent/src为资源目录
确保Maven编译阶段只处理生成目录和loader/src,同时通过IDE插件让agent/src可见:
- 不要将
agent/src添加到build-helper的源码路径中,避免Maven编译它。 - 使用
build-helper-maven-plugin的add-resource目标,将agent/src标记为资源目录,这样IDE会自动识别并显示该目录:
<execution> <id>add-resources</id> <phase>generate-sources</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <resources> <resource> <directory>agent/src</directory> <includes> <include>**/*.java</include> </includes> </resource> </resources> </configuration> </execution>
这样agent/src会作为资源目录出现在IDE中,可正常编辑,且不会参与Maven编译,避免重复类问题。
内容的提问来源于stack exchange,提问作者Jokkeri

