使用GMaven插件设置Maven属性遇资源过滤替换失败问题咨询
你遇到的问题核心在于:gmaven-plugin 1.0 中直接修改 project.properties Map的方式,没有触发Maven资源过滤机制的属性更新。
虽然其他插件(如maven-antrun-plugin、build-helper-maven-plugin)可以通过Project API读取到你设置的user.id属性,但maven-resources-plugin的资源过滤逻辑依赖于Maven的插值器(Interpolator)——这个插值器在生命周期初期会加载一套属性集合,直接修改project.properties的Map不会通知插值器更新,导致过滤时无法解析${user.id}占位符。
另外需要确认:你的gmaven-plugin是否已经引入了commons-lang依赖?如果没有,需要补充依赖才能让StringUtils.lowerCase()正常执行(不过你提到其他插件能读到属性,说明代码已经成功执行了,这一点可能不是问题)。
下面提供三种可靠的解决方法,都能实现将user.name转小写并让资源过滤正确识别:
方案1:修正gmaven-plugin的属性注册方式
将Groovy代码中直接修改Map的操作,改为调用Maven Project对象的addProperty()方法,确保属性被正式注册到Maven的属性体系中,这样插值器就能识别到它:
<plugin> <groupId>org.codehaus.groovy.maven</groupId> <artifactId>gmaven-plugin</artifactId> <version>1.0</version> <executions> <execution> <phase>validate</phase> <goals> <goal>execute</goal> </goals> <configuration> <source> import org.apache.commons.lang.StringUtils // 使用addProperty方法注册属性,确保插值器能感知到 project.addProperty("user.id", StringUtils.lowerCase(project.properties["user.name"])) </source> </configuration> </execution> </executions> <!-- 若环境未自动引入commons-lang,需添加以下依赖 --> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> </dependencies> </plugin>
方案2:改用maven-antrun-plugin完成转换
既然你提到maven-antrun-plugin能正常读取自定义属性,我们可以用它来实现user.name的小写转换,避免gmaven-plugin的兼容性问题:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>validate</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <!-- 用Ant的JavaScript脚本将user.name转为小写并设置为user.id --> <script language="javascript"> const userName = project.getProperty("user.name"); project.setProperty("user.id", userName.toLowerCase()); </script> </target> </configuration> </execution> </executions> </plugin>
这个方案不需要额外引入第三方依赖,利用Ant内置的JavaScript脚本就能完成转换,兼容性更好。
方案3:直接在资源文件中使用Maven表达式(最简洁)
如果你使用的是Maven 3.5.0及以上版本,可以直接在manifest.yml中使用Maven的内置表达式完成小写转换,不需要额外插件:
修改manifest.yml的内容:
- name: ${user.name.toLowerCase()}-app
然后确保maven-resources-plugin的过滤配置保持不变(默认已经支持表达式计算):
<plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-context</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.basedir}/target</outputDirectory> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <include>manifest.yml</include> </resource> </resources> <!-- 确保默认分隔符开启(默认就是true) --> <useDefaultDelimiters>true</useDefaultDelimiters> </configuration> </execution> </executions> </plugin>
这个方案最简洁,直接利用Maven的表达式语法完成转换,省去了额外插件的配置。
内容的提问来源于stack exchange,提问作者Sri Jay

