容器中Jenkinsfile调用install4j时波浪号(~)未正确展开问题
问题现象
在容器内通过Jenkinsfile的Groovy脚本调用install4j时,路径中的波浪号(~)未被正确展开,日志出现异常路径:
[WARNING] The JDK with name "JDK 1.8" has not been configured in this install4j installation
(config file /home/jenkins/agent/workspace/trunk_ci/?/.config/install4j/v10/config.xml)
此前未配置自定义Maven本地仓库时,也出现类似路径异常:执行mvn help:evaluate -Dexpression=settings.localRepository后,输出为:
'/home/jenkins/agent/workspace/trunk_ci/?/.m2/repository'
问题发生在withMaven代码块内,代码示例:
withMaven(mavenSettingsConfig: '...', mavenOpts: '...', mavenLocalRepo: '...') { sh "mvn clean package -e -U -B -ntp -Dinstall4j.disableSigning" }
核心原因
波浪号(~)的路径展开是Shell解析器负责的操作,在Jenkins withMaven上下文环境中,可能存在以下问题:
HOME环境变量未正确设置,导致Shell无法识别~对应的用户主目录withMaven插件的mavenLocalRepo参数使用了~,但插件未做路径展开处理- install4j或Maven内部直接使用
~,未通过Shell或Java系统属性解析
解决方案
1. 替换~为显式环境变量
在所有路径引用中,用${HOME}(Shell环境变量)或${user.home}(Java系统属性)代替~,确保路径能被正确解析。修改Jenkinsfile示例:
withMaven( mavenSettingsConfig: '...', mavenOpts: '...', mavenLocalRepo: "${HOME}/.m2/repository" ) { sh "mvn clean package -e -U -B -ntp -Dinstall4j.disableSigning -Dinstall4j.configDir=${HOME}/.config/install4j/v10" }
2. 检查并修正mavenLocalRepo配置
如果mavenLocalRepo参数设置了包含~的路径,直接替换为绝对路径或环境变量展开的路径,避免插件传递未解析的路径给Maven。
3. 确保容器内HOME环境变量正确
在withMaven块内先打印HOME变量确认是否正常:
withMaven(...) { sh "echo $HOME" sh "mvn clean package -e -U -B -ntp -Dinstall4j.disableSigning" }
如果输出异常,需调整容器镜像配置,在Dockerfile中添加:
ENV HOME /home/jenkins
或在Jenkins Agent的配置中显式设置HOME环境变量。
4. 调整install4j配置使用系统属性
修改install4j项目设置,将配置文件路径从~/.config/install4j/...改为${user.home}/.config/install4j/...,让Java自动解析用户主目录,无需依赖Shell的~展开。
内容的提问来源于stack exchange,提问作者Reto Höhener

