Skip to content

Commit f752aaa

Browse files
committed
err
1 parent 8ef1600 commit f752aaa

1 file changed

Lines changed: 90 additions & 0 deletions

File tree

_posts/2024-10-04-csr.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
---
2+
layout: post
3+
title: "JDK 的 CSR"
4+
categories: java
5+
tags: CSR
6+
---
7+
8+
---
9+
10+
Note: This page is still under construction
11+
12+
---
13+
14+
CSR 意为兼容性和定义复核,是改动 JDK 接口必须经过的一个流程。这个流程相当于对接口和被依赖的行为的品控,避免对 Java 平台的一些改动带来过大恶果。
15+
16+
## 大致流程
17+
18+
- 提交主补丁,确定改动的 Javadoc 和 API 定义
19+
- 在主 issue 下 More -> Create CSR,然后填写 CSR
20+
- 别人审核批准补丁也会审核批准你的 CSR,算工程师批准
21+
- CSR 获得工程师批准后从草稿状态转定稿
22+
- 等 CSR 领头批准。
23+
- 批准时可能会提其他要求,比如改一些词汇或者写更新日志,不要忘
24+
- 有可能变临时,需要你回复疑问或者修改,然后重新转定稿,等下一轮批准
25+
- 批准后又对 Javadoc 或者 API 定义改动,则需要重新转草稿修改,然后再转定稿重新批准!
26+
- CSR 通过后可以合并补丁
27+
28+
## CSR 格式
29+
30+
CSR 都有主 issue。在主 issue 中选择 More -> Create CSR 即可创建空模板的新 CSR。
31+
32+
格式原文可参见 [wiki](https://wiki.openjdk.org/display/csr/Fields+of+a+CSR+Request)
33+
34+
- Description 介绍:文字部分分4块,Summary 总结、Problem 问题、Solution 方案、Specificaiton 定义。
35+
- 总结:简单概括改动的主旨,比如添加新字段方法
36+
- 问题:列举下需要改动的理由,比如某些值常用但是直接写常量容易出错,最好用字段常量等,或者某些方法很常用,同时 JDK 能提供的实现比用户自己实现的更好
37+
- 方案:列举下具体的改动。有时候也可以列举下其他方案,然后为什么不采用其他方案等
38+
- 定义:定义变动。一般 Javadoc 都算定义,除了 `@apiNote` `@implNote`,然后接口类型字段加减也算。一般上传 git diff 但是移除非接口和定义改动。
39+
- Assignee 负责人:只有负责人能够推进 CSR 的状态
40+
- Component/Subcomponent:和主 issue 相同
41+
- Status 状态:
42+
- Draft 草稿:刚创建的初始状态。
43+
- Proposed 提议:告诉 CSR 希望获得早期审核,一般会给反馈后进临时。
44+
- Provisional 临时:审核后的状态。记得回复或者进行改动,然后重新进终稿!
45+
- Finalized 定稿:有了工程师批准后其他状态才可以进定稿。只有定稿才能被批准。
46+
- Closed/Appoved 批准:批准了,可以提交改动。
47+
- Closed/Withdrawn 撤回:补丁被抛弃,或者不需要 CSR。
48+
- Compatibility Kind 兼容性种类:source 编译兼容性、binary 字节码运行兼容性、behavioral 行为兼容性
49+
- Compatibility Risk 兼容性风险等级
50+
- Compatibility Risk Description 兼容性风险介绍:介绍具体兼容风险和为什么评某个等级
51+
- Reviewed By 工程师批准:有了工程师批准后才能定稿提交 CSR 去被批准。
52+
- Scope 范围:一般是 java. 模块是 SE,jdk. 模块是 JDK,对接口没影响的一般算 Implementation。
53+
- Interface Kind 接口种类:打勾,一般核心库是 Java API。
54+
- Fix Version/s 修复版本:必须提前选择,补丁针对的版本。没正确版本 CSR 不会审核!
55+
- Attachments 附件:一般定义变动的 git diff 太大可以用附件上传。
56+
57+
## 兼容性种类
58+
59+
一般 API 修改会编译和字节码运行都会有兼容考量,但是有些特例。
60+
61+
### Source 编译兼容
62+
63+
之前 Sequenced Collection 破坏编译兼容,同时实现`List``Deque`的类无法继续编译,`reverse`。但是运行时因为两个`reverse`字节码签名不同,老版本实现可以继续正常跑。
64+
65+
### Binary 字节码运行兼容
66+
67+
比如一个方法,返回从`Object``String`。编译还是没问题,返回值完全兼容,但是字节码签名变了,老版本下游依赖不能用这个新方法,老方法被移除了。
68+
69+
### Behavioral 行为兼容
70+
71+
比较常见。比如以前不报错现在报错,报错种类不同,返回值变化,能接收的参数种类更广这样的。
72+
73+
74+
75+
<script src="https://giscus.app/client.js"
76+
data-repo="liachmodded/liachmodded.github.io"
77+
data-repo-id="MDEwOlJlcG9zaXRvcnkxMTU2NzU0Mjc="
78+
data-category="Announcements"
79+
data-category-id="DIC_kwDOBuURI84CfnKT"
80+
data-mapping="pathname"
81+
data-strict="0"
82+
data-reactions-enabled="0"
83+
data-emit-metadata="1"
84+
data-input-position="top"
85+
data-theme="preferred_color_scheme"
86+
data-lang="en"
87+
data-loading="lazy"
88+
crossorigin="anonymous"
89+
async>
90+
</script>

0 commit comments

Comments
 (0)