Jenkins流水线集成Artifactory遭遇GString转String类型转换异常
解决Jenkins Artifactory Maven插件的ClassCastException问题
这个java.lang.ClassCastException: org.codehaus.groovy.runtime.GStringImpl cannot be cast to java.lang.String错误,本质是Groovy的GString类型和Java原生String类型不兼容——你在rtMaven.run()中传入的goals参数是通过字符串插值(${})生成的GString,但Artifactory插件的MavenBuild.run()方法内部期望的是纯Java String,导致类型转换失败。
下面是两种可行的修复方案:
临时本地解决办法
方案1:显式将GString转换为String
把拼接的goals字符串通过.toString()方法强制转为Java String,避免类型不匹配:
stage('Artifactory Deploy') { options { timeout(time: 5, unit: 'MINUTES') } when { anyOf { branch "master"; branch "develop" } } steps { withMaven(jdk: "${JDK_VERSION}", maven: 'M3') { script { def server = Artifactory.server('itext-artifactory') def rtMaven = Artifactory.newMavenBuild() rtMaven.deployer server: server, releaseRepo: 'releases', snapshotRepo: 'snapshot' rtMaven.tool = 'M3' // 显式转换为String,避免GString类型冲突 def mavenGoals = ("--threads 2C --no-transfer-progress install --activate-profiles artifactory " + "-Dmaven.repo.local=${env.WORKSPACE.replace('\\','/')}/.repository").toString() def buildInfo = rtMaven.run pom: 'pom.xml', goals: mavenGoals server.publishBuildInfo buildInfo } } } }
方案2:使用withMaven的mavenLocalRepo参数(更贴合你的需求)
既然你倾向于用withMaven的mavenLocalRepo配置本地仓库,那可以直接通过这个参数设置,避免手动拼接-Dmaven.repo.local参数,同时注意将插值后的参数转为String:
stage('Artifactory Deploy') { options { timeout(time: 5, unit: 'MINUTES') } when { anyOf { branch "master"; branch "develop" } } steps { // 将jdk参数显式转为String,规避潜在的GString类型问题 withMaven(jdk: "${JDK_VERSION}".toString(), maven: 'M3', mavenLocalRepo: '.repository') { script { def server = Artifactory.server('itext-artifactory') def rtMaven = Artifactory.newMavenBuild() rtMaven.deployer server: server, releaseRepo: 'releases', snapshotRepo: 'snapshot' rtMaven.tool = 'M3' // 无需手动指定-Dmaven.repo.local,withMaven已自动配置本地仓库路径 def buildInfo = rtMaven.run pom: 'pom.xml', goals: "--threads 2C --no-transfer-progress install --activate-profiles artifactory".toString() server.publishBuildInfo buildInfo } } } }
上游Bug修复建议
你可以在JFrog的官方GitHub仓库(比如jfrog/jenkins-artifactory-plugin)提交Issue,建议插件团队修改MavenBuild.run()方法的参数处理逻辑:
- 在方法内部自动将传入的CharSequence(GString实现了这个接口)转换为String,而非直接强制类型转换
- 或者将方法参数类型从
String改为CharSequence,兼容Groovy的GString类型
这样能从根源上避免其他Groovy用户遇到同样的类型转换问题。
内容的提问来源于stack exchange,提问作者Amedee Van Gasse
相关产品推荐
相关产品推荐

