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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:22:47