GitHub Action:如何在测试中替换文件中的字符串
简介
我目前正在开发一款GitHub Action,希望验证其是否适配多个Java版本。为此,我需要在每次测试时更新pom.xml文件,并修改其中的Java版本配置。
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>io.github.pseudo</groupId> <artifactId>template</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>template</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>JAVAVERSION</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> </properties> </project>
问题
请问如何在每次测试中实现文件内字符串的替换操作?
解决方案
方法1:Shell命令直接替换文件内容
在GitHub Actions工作流中,可通过平台对应的shell命令替换pom.xml里的JAVAVERSION占位符,结合版本矩阵就能批量测试多个Java版本:
Linux/macOS runner(sed命令)
jobs: test: runs-on: ubuntu-latest strategy: matrix: java-version: [8, 11, 17, 21] # 要测试的Java版本列表 steps: - uses: actions/checkout@v4 - name: 替换pom.xml中的Java版本 run: sed -i 's/JAVAVERSION/${{ matrix.java-version }}/g' pom.xml - name: 配置对应Java版本 uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} distribution: 'temurin' - name: 执行Maven测试 run: mvn test
Windows runner(PowerShell命令)
如果需要兼容Windows环境,用PowerShell的文本替换命令:
- name: 替换pom.xml中的Java版本 run: (Get-Content pom.xml) -replace 'JAVAVERSION', '${{ matrix.java-version }}' | Set-Content pom.xml
方法2:Maven命令行覆盖属性(更推荐)
不需要修改pom.xml文件,Maven支持在命令行直接覆盖属性值,更简洁且避免文件修改:
jobs: test: runs-on: ubuntu-latest strategy: matrix: java-version: [8, 11, 17, 21] steps: - uses: actions/checkout@v4 - name: 配置对应Java版本 uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} distribution: 'temurin' - name: 执行Maven测试(覆盖Java版本属性) run: mvn test -Djava.version=${{ matrix.java-version }}
这种方式下,maven.compiler.source和maven.compiler.target会自动继承java.version的新值,完全满足多版本测试需求。
内容的提问来源于stack exchange,提问作者Rasbypy
相关产品推荐
相关产品推荐

