如何在jenkins共享库中打印某些类的实例,而无需显式调用toString()方法

时间:2018-12-28 22:41:37

标签: jenkins jenkins-pipeline

我有jenkins共享库。它具有一些CustomClass.groovy,其中包含重写的toString()方法:

package com.jenkins

class CustomClass {

    CustomClass(){
    }

    @Override
    String toString() {
        return "custom_class"
    }
}

我有Jenkinsfile:

@Library("sharedlib@to-string")
import com.jenkins.CustomClass

println("1")
println(new CustomClass())

println("2")
println("prefix: " + new CustomClass())

println("3")
println("prefix: " + new CustomClass().toString())

它产生以下输出:

[Pipeline] echo
1
[Pipeline] echo
2
[Pipeline] echo
custom_class
[Pipeline] echo
3
[Pipeline] echo
prefix: custom_class
[Pipeline] End of Pipeline
Finished: SUCCESS

我对该输出有些困惑:

  1. 第一个示例为什么不打印任何内容?
  2. 为什么第一个示例没有打印前缀?为什么只实例?
  3. 第二个和第三个示例为何不同?为什么在这里我看到前缀,但是在第二个示例中看不到它。为什么第一个示例没有打印任何内容,而第三个示例可以正常打印呢?毕竟,在第二个示例中,println()方法隐式使用toString()。

1 个答案:

答案 0 :(得分:0)

根据Pipeline Readme :-)

  

请特别注意,在二进制类(例如@Override)中定义的方法的Object.toString()通常应标记为@NonCPS,因为通常是调用它们的二进制代码。

以下内容将正常工作:

class A{
    @NonCPS
    @Override
    public String toString(){
        return "A[123]"
    }
}

node {
    def a = new A()
    echo('1 >>>')
    echo(message: "Hello ${a}")
    echo('2 >>>')
    echo(message: "Hello " + a)
    echo('3 >>>')
    echo(message: "Hello " + a.toString())
}