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

在这个共享库中什么是“不可序列化的”,我如何修复它?

金子轩
2023-03-14

当使用Jenkins管道插件时,构建会因java错误而失败。木卫一。NotSerializableException错误,如下所示:

java.io.NotSerializableException: org.codehaus.groovy.control.ErrorCollector
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    ...
Caused by: an exception which occurred:
    in field collector
    in field abnormal
    in field outcome
    in field body
    in field step
    in field thread
    in field this$0
    in field returnAddress
    in field parent
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@6ae7e4f1
    ...
Finished: FAILURE

当我使用带有一些导入语句的自定义库时,会发生这种情况。我尝试了几件事情,比如用@NonCPS将调用封装在一个方法中,但是错误仍然存在。

管道脚本

#!groovy
@Library('utils')

pipeline {
    agent any
    stages {
        stage('Run Script') {
            script {
                myScript param1
            }
        }
    }
}

vars/myScript。棒极了

import com.company.jenkins.utils

def call(String param = "test") {
    def libScript = LibScript(this)
    libScript.printMessage("Hello World")
}

src/com/company/jenkins/utils/LibScript

package com.company.jenkins.utils;

// This import works fine
import groovy.json.*

// This one fails
import groovyx.net.http.RESTClient

class LibScript implements Serializable {
    def steps
    def client

    LibScript(steps) { this.steps = steps }

    def printMessage(String message) { steps.echo "Saying: " message }

    // This also fails
    @NonCPS
    def doSomething() { client = new groovyx.net.http.RESTClient( 'https://somehost/' ) }
}

使用的版本:

  • 詹金斯:2.19。3

共有2个答案

牟正真
2023-03-14

正如公认的答案所述,此(非描述性)错误表示某种编译错误。接下来的问题是跟踪编译错误是什么,因为错误消息基本上没有告诉您什么。

看来,获取此非描述性编译错误消息只是使用声明性管道时的一个问题。如果要切换到脚本化管道,则会收到更具体的错误消息。

但是,如果使用try-catch块包装有问题的代码,则可以从声明性管道中获得更多描述性错误。作为我的一些代码中的一个示例,我从这段管道代码中缩小了NotSerializableException的范围:

post{always{notifyOnBuildResults currentBuild:currentBuild}}

我把密码改成了这个

post{always{script{try{notifyOnBuildResults currentBuild:currentBuild}catch(异常e){echo e.toString()}}}}}

并且能够看到具体的编译错误。

曹铭晨
2023-03-14

由于编译错误,将出现此错误。这不是一个很好的跟踪。但是你有一个<代码>不可序列化的对象< /C>作为你的变量之一,或者在字符串的中间(可以有变量值“……$var”…..)。为此,我附加了两个链接。请通读一遍,你就会明白出了什么问题。请一步一步地运行以了解哪里出了问题。

1)https://issues.jenkins-ci.org/browse/JENKINS-40109

https://coderwall.com/p/zvsh5q/jenkins-load-command-can-t-found-why-i-have-a-java-io-notserializableexception

 类似资料:
  • 我写了以下函数,它被加载到我的管道: 结果应该是触发构建的用户名,在清理输出之前,它看起来是这样的: 基本上,这: 也会给我所需的输出,但我不知道如何在这个语句中转义字符。 当我运行作业时,我得到以下错误: 我非常确定这与我试图转义相关字符有关,但我有一种感觉,我没有做对,我试图转义cmd行末尾的(“),但没有成功。 你能找到我的问题吗?

  • 问题内容: 当以详细模式运行jvm时,它显示文件正在从共享库文件中加载,如下所示 什么是共享库文件?我以为这些是rt.jar中的文件,并且从那里开始加载;但是rt.jar的打开时间很长 提取rt.jar之后,无论如何,我发现它具有从共享库文件中加载的所有类。 问题答案: 这是类数据共享。运行Sun / Oracle Client HotSpot并启用共享(默认值或)时,该文件将进行内存映射。该文件

  • 如果接口只是一个标记接口,用于在 java 中传递有关类的某种元数据 - 我有点困惑: 在阅读了java的序列化算法(元数据从下到上,然后从上到下的实际实例数据)的过程之后,我无法真正理解哪些数据不能通过该算法进行处理。 简而言之: 哪些数据可能导致? 我怎么知道我不应该为我的类添加子句?

  • 问题内容: 如何序列化未实现Serializable的对象?我不能将其标记为Serializable,因为该类来自第3方库。 问题答案: 您不能序列化未实现的类,但可以将其包装在可以实现的类中。为此,您应该在包装器类上实现和,以便可以以自定义方式序列化其对象。 首先,使您的非序列化字段。 在中,首先调用流以存储所有非瞬态字段,然后调用其他方法来序列化不可序列化对象的各个属性。 在中,首先调用流以读

  • 我需要将12小时的时间转换为24小时的格式。 我现在已经把12小时的时间硬编码了,以使事情更简单。 我的逻辑:输入sting 07:05:45PM提取最后2个字符。如果AM check为前两个字符,则为12。。如果是,则将其设置为00,否则按原样输出,如果PM检查前两位数字是否为12。。如果是,请保持原样,如果不是,则在前2位加上12 总线错误:10是我运行代码得到的

  • 问题内容: 如下代码: 引发以下异常: 我猜内部类具有一个允许对其私有访问的字段和方法的字段。声明内部类static 可以解决它,但是如果需要此访问权限怎么办?有没有一种方法可以在不包含封闭类的情况下序列化非静态内部类,例如通过引用外部类? 编辑:例如,仅在序列化之前才需要访问外部类。好的,编译器不知道这一点,但是我认为这就是关键字存在的原因。 问题答案: 如果InnerClass需要此访问权限怎