如何理解Jenkins中Run与Job类的定义?
理解Jenkins中Job与Run类的定义
让我来拆解一下Jenkins里这两个核心类的定义,帮你搞懂它们之间的绑定逻辑和设计思路:
首先看Job类的泛型定义,这是最容易让人困惑的部分:
public abstract class Job <JobT extends Job<JobT, RunT>, RunT extends Run<JobT, RunT>> extends AbstractItem implements ExtensionPoint, StaplerOverridable, ModelObjectWithChildren {
拆解泛型绑定逻辑
这是一种递归泛型的设计,核心目的是让Job和Run之间形成强类型绑定:
JobT extends Job<JobT, RunT>:这里的JobT代表当前Job的具体子类(比如Jenkins自带的FreestyleProject)。通过这种定义,Job类中的方法可以直接返回JobT类型,而不是抽象的Job父类,调用者无需做强制类型转换,保证了类型安全。RunT extends Run<JobT, RunT>:RunT则是与当前Job对应的具体Run子类(比如FreestyleBuild)。这个绑定确保每个Job实例只能创建和关联属于自己的Run类型,避免了跨类型的错误关联。
从注释理解Run的定位
再看Run类的注释:
/**
- {@link Job}的一次具体执行实例。
- 自定义{@link Run}类型始终与自定义{@link Job}类型配合使用,因此自定义{@link Run}类型无需单独的注册机制。
- @author Koh...
*/
这段注释点出了两个关键信息:
- Run的本质:它就是
Job的一次执行记录——比如你手动触发一次Jenkins任务,或者定时任务自动执行,每一次执行都会生成一个Run实例,用来保存这次执行的日志、状态、结果等核心信息。 - 自定义扩展的简化:如果你开发Jenkins插件,自定义了一个
Job子类,只需要在泛型中指定对应的Run子类即可,不需要单独注册这个Run类型。Jenkins会通过Job的泛型参数自动关联对应的Run,大大简化了插件开发的流程。
这种设计的核心优势
- 编译期类型安全:通过泛型绑定,编译器就能检查出
Job和Run的类型不匹配问题,避免运行时的类型转换异常。 - 清晰的扩展边界:每个自定义
Job都有自己专属的Run类型,职责划分明确,便于后续的维护和扩展。
内容的提问来源于stack exchange,提问作者Lu Lu
相关产品推荐
相关产品推荐

