当前位置: 首页 > 知识库问答 >
问题:

使用Groovy和StreamAPI的意外GroovyCastExcture

鲜于俊侠
2023-03-14

我正在Jenkins文件中运行以下groovy脚本,该文件在构建期间执行:

import java.util.stream.Collectors
import java.util.stream.Stream
import groovy.transform.Field

@Field
Map<String, String> sampleMap = [
        'SampleKey1': 'SampleValue1',
        'SampleKey2': 'SampleValue2'
]

//example param value: "C/SampleKey1/someFile, C/SampleKey2/someFile2"
private Collection<String> getValues(String param) {
    Stream.of(param.split(','))
            .map { getValueFromOnePath(it) }
            .filter { !it.isEmpty() }
            .distinct()
            .collect(Collectors.toList())
}

private String getValueFromOnePath(String path) {
    String[] pathParts = path.split('/')
    if (pathParts.size() < 2) {
        return ''
    }
    return sampleMap[pathParts[1]] ?: ''
}

上述参数值代码的预期结果等于:

"C/SampleKey1/someFile, C/SampleKey2/someFile2"

是:

[SampleValue1, SampleValue2]

但是,在Jenkins上执行此代码时,我收到一个奇怪的错误,我无法理解(为什么会发生):

hudson.remoting.ProxyExc0019:org.codehaus.groovy.runtime.typehandling.GroovyCastExc0019:无法将对象'SampleValue1'与类'java.lang.字符串'到类'java.util.集合'org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405)org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319)org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnCollection(DefaultTypeTransformation.java:267)org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeT<-PLHD--15/>)org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603)at Unknown.cps.transform(本地方法)的未知(未知)LocalVariableBlock$LocalVariable. set(LocalVariableBlock. java: 45)在com. Cloud dbee. groovy. cps. implified。AssignmentBlock$ContinuationImp.任务和完成(AssignmentBlock. java: 70)at sun. reff.GeneratedMEDAccessor303. invoke(未知的来源)在sun.反射。在java. lang.反射中调用(委托方法访问或执行. java: 43)。在com. Cloud dbees. groovy. cps. implified. invoke(method. java: 498)。ContinuationPtr$ContinuationImp. get(ContinuationPtr. java: 72)在com. Cloud dbee. groovy. cps. implified。LocalVERableBlock$LocalVERableBlock. get(LocalVERableBlock. java: 39)在com. Cloud dbee. groovy. cps。LValueBlock$GetAdapter.接收(LValueBlock. java: 30)在com. Cloud dbee. groovy. cps. implified。java: 28)在com. Cloud dbee. groovy. cps.LValueBlock$BlockImp. ava(LValueBlock. java: 55)在com. Cloud dbee. groovy. cps。LValueBlock. ava(LValueBlock. java: 16)在com. Cloud dbee. groovy. cps.下一步(下一步. java: 83)在com. Cloud dbee. groovy. cps。持续1美元。调用(持续. java: 174)在com. Cloud dbee. groovy. cps。在org. codehaus. groovy. runtime持续调用(持续. java: 163)。在org. codehaus. groovy. runtime中使用(Groovy类别支持. java: 122)。在com. Cloud dbee. groovy. cps上使用(Groovy类别支持. java: 261)。在org. jenkinsi. plugins. workflow. cps上运行0(Continuable. java: 163)。在org. jenkinsi. plugins. workflow. cps上获得1美元(Sandbox Continuable. java: 19)。在org. jenkinsi. plugins. workflow. cps.调用(Sandbox Continuable1美元。在org. jenkinsi. plugins. criptsecurity. sanbox. groovy.调用(Sandbox Continuable1美元。GroovySandbox. runInSandbox(GroovySandbox. java: 108)在org. jenkinsci. plugins. workflow. cps。在org. jenkinsc. plugins. workflow. cps.cpsThread. runNextChunk(cpsThread. java: 174)at org. jenkinsi. plugins. workflow. cps.cpsThreadGroup. run(CpsThreadGroup. java: 331)at org. jenkinsi. plugins. workflow. cps.在org. jenkinsi. plugins. workflow. cps上获得100美元(CpsThreadGroup. java: 82)。CpsThreadGroup. call(CpsThreadGroup. java: 243)at org. jenkinsi. plugins. workflow. cps.CpsThreadGroup. call(CpsThreadGroup. java: 231)at org. jenkinsi. plugins. workflow. cps.CpsVmExecutorService2 Dollars. call(CpsVmExecutorService. java: 64)at java. util. con电流。FutureTasks. run(FutureTasks. java: 266)at hudson. Remote.SingleLaneExecutorService1美元. run(SingleLaneExecutorService. java: 112)在jenkins. util.运行(ContextResettingExecutorService1美元. run(ContextResettingExecutorService. java: 28)在java. util.并发。执行器$RunnableAdapter. call(Executors. java: 511)在java. util. con当前。FutureWork. run(FutureTasks. java: 266)at java. util. con当前。ThreadPoolExecutor. runWorker(ThreadPoolExecutor. java: 1149)在java. util. con当前。在java. lang上运行(ThreadPoolExecator. java: 624)。线程.运行(线程. java: 748)

有什么想法吗?

共有1个答案

苗征
2023-03-14

您可以尝试使用@NonCPS注释对getValues进行注释。还要尽量避免在Jenkins沙盒中执行的代码中使用流,这通常是导致错误的原因。希望能有帮助。

 类似资料:
  • 我需要将Spring Security内核添加到Grails中。我已经使用:BuildConfig将spring核心安全插件添加到grails 2.3.8应用程序中。groovy插件{…编译“:Spring Security核心:2.0-RC4”。。。 然后是s2 quickstart sim GUser GRole 文件GUserGRole。groovy包含以下错误: Groovy:意外标记:v

  • 问题内容: 我想使用groovy脚本从Maven执行jmeter测试,但出现以下错误。为了设置jmeter和maven,我做了这里描述的操作。 我是否应该将groovy函数和实体打包到jar中,然后复制到jmeter的lib目录中,然后仅将那些groovy脚本放在包含采样器代码的jmx文件旁边? 问题答案: 我找到了答案: 我需要将要在测试中使用的库打包到jar中,并将其放入目录中 我必须对齐Sa

  • 是否有办法过滤掉所有大于最大值的值,这些值可以使用Stream API存储在中? 目前的情况是,你可以在前端用一个简单的搜索栏搜索一些客户的身份证。 例如:

  • nit.java:593nit.java:569AntlrParserPorg.codehaus.groovy.control.CSTIntoAST(AntlrParserPnit.compile)在nit.java:546AntlrParserPgroovy.lang.CST(AntlrParserPoader.do)在oader.java:298SourceUnit.parse(SourceU

  • 我需要使用Repast Simphony作为模拟器开发迭代囚徒困境的Java版本。 其思想是,每个都是一个代理,我们有一个网格,由组成,无法移动。每个必须与4个邻居(北部、南部、西部和东部)比赛,根据每轮4场不同比赛的结果找到最佳策略。 由于在Repast Simphony中没有一个内置的系统来在代理之间交换消息,所以我不得不实施某种解决方案来处理代理的同步(a对B和B对a应该算作同一轮,这就是为

  • 问题内容: 我是React和Webpack的新手。我正在设置我的第一个项目,当我尝试运行webpack-dev-server时,我的代码无法编译! *下面的 *更新 答案是正确的。我需要添加到babel loader预设中。您可以在这里查看项目的完整资源:https://github.com/cleechtech/redux- todo 错误: src / index.js: src / comp