Apache Cassandra 许可证合规指南:LICENSE/NOTICE 文件与 Apache RAT 构建校验机制
【免费下载链接】cassandraOpen source transactional distributed database. Linear scalability and proven fault-tolerance on commodity hardware or cloud infrastructure without compromising performance.项目地址: https://gitcode.com/GitHub_Trending/cassa/cassandra
本篇技术指南聚焦 Apache Cassandra 项目在源码与构建产物层面如何落实 Apache 软件基金会(ASF)的许可政策:仓库内LICENSE、NOTICE法律文件的职责分工,以及基于 Apache RAT 工具在构建阶段自动审计许可证头(License Header)的完整机制。读者读完本篇,将能理解 Cassandra 的许可证合规体系如何运转、哪些文件会被检查、哪些文件可以豁免,以及当合规检查失败时应如何定位并修复问题。
一、为什么开源分布式数据库需要"许可证合规"机制
Apache Cassandra 是一个开源的分布式事务数据库,代码由大量贡献者提交,且依赖众多第三方开源组件。作为一个 Apache 顶级项目,Cassandra 的源码与发布构件必须遵守 ASF 的发布政策(Release Policy)中关于许可的规定——即 ASF 许可政策(ASF Licensing Policy)。这份政策要求:
- 项目中由版权所有者或其代理人直接提交给 ASF 的作品,其源文件必须带有适当的 ASF 许可证头;
- 项目必须随发布物附带完整的
LICENSE文件与NOTICE文件; - 引入的第三方依赖许可信息必须可追溯、可审计。
为此,Cassandra 项目建立了"法律文件 + 自动化工具"双重保障:仓库根部维护LICENSE与NOTICE文件,构建系统则引入 Apache RAT(Release Audit Tool)对全部受管源文件执行许可证头合规审计。官方文档《License Compliance》(即 doc/modules/cassandra/assets/license_compliance.rst)对这一机制给出了总览,本篇将结合仓库实现展开详解。
二、仓库中的法律文件:LICENSE.txt 与 NOTICE.txt
仓库根目录维护两份法定文件,它们共同构成 Cassandra 对外发布时的许可声明:
LICENSE.txt(LICENSE.txt):全文为 Apache License 2.0 的完整条款(共 252 行),包含定义(Definitions)、版权授予、再分发条件、免责声明等标准章节,以及附录中的"如何为你的作品附加许可证头"模板。该文件向使用者明示:Cassandra 以 Apache License 2.0 授权,任何基于它的再分发都必须保留此许可证全文。
NOTICE.txt(NOTICE.txt):用于声明版权归属与随附的第三方软件。文件开头即声明:
Apache Cassandra Copyright 2009- The Apache Software Foundation随后列出本项目包含的第三方开源组件及其版权信息,例如 Android Code(Copyright 2005-2008 The Android Open Source Project)。这是 ASF 许可政策的强制要求:当项目再分发包含第三方作品时,NOTICE文件必须保留这些第三方版权声明。
在 RAT 检查中,这两份文件属于"法律文件"类别,被显式排除在许可证头检查之外(见下文 RAT 配置中的<exclude NAME="NOTICE.txt"/>与<exclude NAME="LICENSE.txt"/>),因为它们是 ASF 政策规定的标准文件,本身即是许可合规的载体。
三、核心校验工具:Apache RAT(Release Audit Tool)
文档明确指出,Cassandra 使用Apache RAT 工具强制并验证所有源文件的 ASF 许可证头合规。RAT 是 Apache 官方提供的发布审计工具,用于扫描代码库,统计哪些文件带有认可的许可证头、哪些文件缺失或使用了未批准的许可证。
在 Cassandra 构建系统中,RAT 的集成位于 .build/build-rat.xml,其rat-checktarget 完整实现了从"收集文件清单"到"输出报告"再到"失败门禁"的闭环:
<target name="_rat_init" depends="resolver-init"> <typedef uri="antlib:org.apache.rat.anttasks" classpathref="rat.classpath"/> </target>_rat_init将 RAT 的 Ant 任务库(antlib)注册到构建环境。随后_build_ratinclude通过git ls-tree -r HEAD --name-only列出 Git 跟踪的全部文件作为审计范围,并追加 Accord 模块相关文件(由rat-include-accord.sh脚本生成),将清单写入build/.ratinclude。
最终的报告生成与门禁逻辑如下:
<rat:report reportFile="${build.dir}/rat.txt"> <fileset dir="." includesfile="${build.dir}/.ratinclude"> <!-- 大量 exclude 规则 --> </fileset> </rat:report> <exec executable="grep" outputproperty="rat.failed.files" failifexecutionfails="false"> <arg line="-A5 'Unapproved licenses' ${build.dir}/rat.txt"/> </exec> <fail message="Some files have missing or incorrect license information. Check RAT report in ${build.dir}/rat.txt for more details! \n ${rat.failed.files}"> <condition> <and> <not> <resourcecontains resource="${build.dir}/rat.txt" substring="0 Unknown Licenses" casesensitive="false" /> </not> </and> </condition> </fail>这段逻辑的判定流程是:RAT 报告写入build/rat.txt;若报告中不包含0 Unknown Licenses(即存在未知许可证文件),构建即失败,失败信息与文档中给出的警告完全一致。
四、RAT 检查的受检文件类型清单
根据 license_compliance.rst,当前 RAT 会对以下类型的文件检查许可证头:
| 扩展名 | 典型用途 |
|---|---|
.bat | Windows 批处理脚本(bin 目录等) |
.btm | 构建/任务脚本 |
.cql | CQL 语句文件(如 doc 下的 CQL 示例) |
.css | 样式表(如 CQL.css) |
.g | ANTLR 语法文件(如 Cql.g、Lexer.g、Parser.g) |
.html | HTML 文档 |
.iml | IntelliJ IDEA 模块文件 |
.java | 核心 Java 源码(src/java 下 3200+ 个文件) |
.jflex | JFlex 词法规则(src/java 下的*.jflex) |
.jks | Java KeyStore 文件 |
.md | Markdown 文档(如 README.asc 之外的 md 文档) |
.mod | 配置修饰文件 |
.name | 名称类资源文件 |
.pom | Maven POM(如 relocate-dependencies.pom) |
.py | Python 脚本(如 pylib 下的 cqlsh 实现) |
.sh | Shell 脚本(如 ci/harry_simulation.sh) |
.spec | 协议规范(如 native_protocol_v3.spec) |
.textile | Textile 格式文档(如 CQL.textile) |
.yml/.yaml | YAML 配置(如 conf/cassandra.yaml) |
.xml | XML 文件(如构建脚本、logback 配置) |
这些文件类型覆盖了 Cassandra 仓库中的绝大部分"创造性作品"——代码、语法定义、文档、脚本与配置文件。从源码结构看,RAT 的检查范围通过git ls-tree动态生成,因此新增的受管文件会自动纳入下一次检查,无需手工维护清单。
五、豁免规则:哪些文件不需要许可证头
文档明确了豁免原则:"没有任何创造性程度的文件"不要求许可证头。纯数据、机械生成或标准模板类文件不具备著作权意义上的创造性,因此无需添加许可证头。
这一原则在 .build/build-rat.xml 的<fileset>排除规则中得到系统化落实,主要分几大类:
配置类文件(配置本身创造性较低):
<exclude name="**/cassandra*.yaml"/> <exclude name="test/conf/cdc.yaml"/> <exclude name="test/conf/commitlog*.yaml"/> <exclude name="tools/cqlstress-*.yaml"/>测试数据与二进制数据(非人类创作内容):
<exclude name="test/**/*.csv"/> <exclude name="test/**/*.txt"/> <exclude name="test/data/**/*.db"/> <exclude name="test/data/**/*.bin"/> <exclude name="test/data/**/*.crc32"/> <exclude name="test/data/**/*.sha1"/>文档与说明文件:
<exclude NAME="doc/modules/**/*"/> <exclude NAME="**/README*"/> <exclude NAME="CHANGES.txt"/> <exclude NAME="NOTICE.txt"/> <exclude NAME="LICENSE.txt"/> <exclude NAME="SECURITY.md"/>IDE 与补丁类文件:
<exclude name=".idea/codeStyles/Project.xml"/> <exclude name="ide/**/*"/> <exclude name="**/*.patch"/> <exclude name="**/*.diff"/>从这一清单可以看出,豁免并非随意放行,而是严格对应 ASF 政策中"无创造性"与"法律文件"两类情形;凡是属于创造性作品(尤其是src/java下的核心代码)都必须携带标准的 Apache License 2.0 许可证头。
六、构建集成:何时触发检查、失败后如何处理
RAT 检查被接入构建流程的两个关键入口(见 build.xml):
checktarget(build.xml 第 790-794 行):依赖_main-jar、build-test、gen-asciidoc,依次调用rat-check、checkstyle、checkstyle-test,定位为提交前(pre-commit)与本地验证的综合检查入口;build-projecttarget(build.xml 第 778-791 行):常规编译构建链中也包含<antcall target="rat-check" inheritrefs="true"/>,确保任何一次标准构建都会执行许可证审计。
当存在不合规文件时,构建失败并输出文档记载的标准警告:
Some files have missing or incorrect license information. Check RAT report in build/rat.txt for more details!此时开发者应打开build/rat.txt(RAT 生成的完整审计报告)定位具体文件。报告中每类许可证(Approved / Unknown 等)都有统计计数与文件明细,重点排查 "Unknown Licenses" 段落下列出的文件。修复方式通常为:
- 源码文件缺失头部:在文件顶部补上标准的 Apache License 2.0 头部模板(模板见 LICENSE.txt 末尾的附录);
- 确属无创造性内容:确认其在排除规则范围内,必要时可向项目提交补充 exclude 规则;
- 引入第三方代码:除添加许可证头外,还需评估是否应在 NOTICE.txt 中补充第三方版权声明。
七、对贡献者的实践要点
综合文档与构建实现,向 Cassandra 贡献代码时需注意以下合规要点:
- 新源码文件必须带 ASF 许可证头:任何新增的
.java、.py、.sh、.cql、.xml等受检类型文件,都应在首部复制标准 Apache License 2.0 头部模板(16 行注释块,内容见仓库中任意既有源文件头部); - 勿破坏既有文件的许可证头:编辑已有文件时保留头部注释,RAT 校验的是头部是否存在及是否合规;
- 不要随意改动排除规则:
build-rat.xml中的 exclude 清单经过审慎设计,如需新增豁免,应说明该文件为何属于"无创造性"范畴; - 本地提交前先跑
ant check:它同时执行 RAT 与 Checkstyle,可在 CI 之前暴露合规问题;若构建失败,优先阅读build/rat.txt报告。
通过"法律文件 + RAT 自动审计 + 构建门禁"三层机制,Apache Cassandra 在保持大型代码库快速演进的同时,确保了 ASF 许可政策的持续合规——这也是一个 Apache 顶级项目能够长期健康发布的基础保障。
【免费下载链接】cassandraOpen source transactional distributed database. Linear scalability and proven fault-tolerance on commodity hardware or cloud infrastructure without compromising performance.项目地址: https://gitcode.com/GitHub_Trending/cassa/cassandra
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考