开发IBM ARE for i插件时,如何用Maven替换Java程序中的构建值?
解决方案:Maven替换Java类中的占位符(无需Spring)
当然可以!不用Spring也完全能通过Maven实现Java代码里的占位符替换,刚好适配你遇到的iSeries打包程序的限制——毕竟咱们要的是编译阶段就把值硬编码到class文件里,完全不依赖外部资源文件,正好绕开ARE「其他文件」上传和resources目录被删除的问题。下面给你几个经过验证的靠谱方案:
方案1:用Maven Resources Plugin 处理Java源文件
这个插件虽然主打资源文件处理,但只要稍加配置,就能把Java源文件当作“资源”来做占位符过滤。核心思路是把带占位符的Java模板文件过滤后生成到编译目录,再用生成后的文件编译。
配置示例
在你的pom.xml里添加如下配置:
<build> <!-- 定义要替换的属性 --> <properties> <application.version>1.0.0</application.version> </properties> <resources> <!-- 处理Java源文件的过滤 --> <resource> <directory>src/main/java-template</directory> <!-- 放带占位符的模板文件 --> <includes> <include>**/*.java</include> </includes> <filtering>true</filtering> <!-- 开启占位符替换 --> <targetPath>${project.build.directory}/generated-sources/java</targetPath> <!-- 生成到编译目录 --> </resource> <!-- 别忘了保留原本的资源文件处理 --> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> </resource> </resources> <!-- 确保编译时用生成后的文件 --> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/java</source> </sources> </configuration> </execution> </executions> </plugin> </plugins> </build>
注意事项
- 把带占位符的Java文件(比如
foo.java)放到src/main/java-template目录,不要直接放在src/main/java,避免原文件被污染。 filtering=true会自动把${application.version}替换成pom里定义的属性值,编译后class文件里就是硬编码的数值了。
方案2:用Maven Replacer Plugin 精准替换
如果只需要替换特定文件里的特定内容,这个插件更灵活,它可以基于正则表达式精准定位要替换的代码片段,不会误改其他地方的占位符。
配置示例
<build> <properties> <application.version>1.0.0</application.version> </properties> <plugins> <plugin> <groupId>com.google.code.maven-replacer-plugin</groupId> <artifactId>replacer</artifactId> <version>1.5.3</version> <executions> <execution> <phase>process-sources</phase> <!-- 编译前执行替换 --> <goals> <goal>replace</goal> </goals> </execution> </executions> <configuration> <file>src/main/java/com/yourpackage/foo.java</file> <!-- 目标文件 --> <replacements> <replacement> <token>int version = \${application.version};</token> <!-- 匹配原代码(注意转义$) --> <value>int version = ${application.version};</value> <!-- 替换后的值 --> </replacement> </replacements> </configuration> </plugin> </plugins> </build>
优势
- 可以精准控制替换范围,比如只替换
foo.java里的version变量,不会影响其他文件。 - 不需要移动原文件,直接在源文件上修改(建议配合版本管理,确保原文件的占位符版本被保留)。
方案3:用Maven AntRun Plugin 结合Ant的Replace任务
如果你熟悉Ant的语法,这个方案也很实用,利用Ant的replace任务来完成替换,配置起来也很直观。
配置示例
<build> <properties> <application.version>1.0.0</application.version> </properties> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>process-sources</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <replace file="src/main/java/com/yourpackage/foo.java"> <replacefilter token="\${application.version}" value="${application.version}"/> </replace> </target> </configuration> </execution> </executions> </plugin> </plugins> </build>
总结
这三个方案都能在编译阶段完成Java代码的占位符替换,生成的class文件里已经是硬编码的值,完全不依赖外部资源文件,完美适配你遇到的iSeries打包程序的限制。个人推荐:
- 如果是批量处理多个带占位符的Java文件,选方案1;
- 如果只需要替换个别文件的特定代码,选方案2更精准。
内容的提问来源于stack exchange,提问作者user1838913
相关产品推荐
相关产品推荐

