You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:12:27