开源协议概览
身为程序员,我们不可避免的要和开源项目打交道,不管是我们自己做了些开源项目,还是使用开源项目,对各种开源协议的了解是必要的。
OSI(Open Source Initiative)
OSI,开发源代码组织,是一个旨在推动开源软件发展的非盈利组织。目前受到OSI承认的开源协议一共83种,具体协议可以在OSI 官网查看。
在 Github 上如何添加开源协议
我们在 Github 上创建一个开源项目时,新建一个名为 LICENSE 的文件时,就会弹出选择开源协议的按钮,我们点进去就可以看到,Github 默认支持的协议模板。点击协议会有详细的介绍。
开源协议一览表
开源协议 | 特点 | 共享 | 修改 | 衍生 | 商业化 | 例子 |
---|---|---|---|---|---|---|
Apache | 允许商业使用和闭源,但需要保留版权声明和使用许可条款 | 可以自由地查看、使用、修改和共享源代码,但修改后的项目必须开放源代码库的链接 | 可以自由选择协议进行修改和衍生项目 | 可以自由选择协议进行商业化 | Hadoop分布式计算框架、Apache Tomcat Web服务器等 | |
GPL | 最严格和强大的,要求任何使用、修改或衍生代码的项目都必须采用GPL协议 | 可以自由地查看、使用、修改和共享源代码 | 必须使用GPL协议进行修改和衍生项目 | 必须使用GPL协议进行商业化 | Linux操作系统、GIMP图像编辑器等 | |
BSD | 简洁和慷慨的,允许商业使用和闭源,但需要保留版权声明 | 可以自由地查看、使用、修改和共享源代码 | 可以自由选择协议进行修改和衍生项目 | 可以自由选择协议进行商业化 | FreeBSD操作系统、Nginx Web服务器等 | |
MIT | 简单和宽松的,允许商业使用和闭源,但需要保留版权声明 | 可以自由地查看、使用、修改和共享源代码 | 可以自由选择协议进行修改和衍生项目 | 可以自由选择协议进行商业化 | React JavaScript库、TensorFlow机器学习框架等 | |
Mozilla | 旨在保护用户隐私和自由,允许商业使用和闭源,但需要保留版权声明 | 可以自由地查看、使用、修改和共享源代码 | 必须使用MPL协议进行修改和衍生项目 | 必须使用MPL协议进行商业化 | Firefox浏览器、Rust编程语言等 | |
LGPL | 允许商业使用和闭源,但需要保留版权声明和使用许可条款,并开放源代码库的链接 | 可以自由地查看、使用、修改和共享源代码,但修改后的项目必须开放源代码库的链接 | 必须使用LGPL协议进行修改和衍生项目,并开放源代码库的链接 | 必须使用LGPL协议进行商业化,并开放源代码库的链接 | Qt开发框架、GTK+图形界面库等 |
三、Apache 2.0
3.1 关键词
修改代码需要说明
3.2 关键点
需要保留原有作者的声明
如果修改了代码,需要进行说明
不承担责任
可以新增许可,但不能对 Apache 协议造成更改
3.3 商业化
可用于商业
3.4 举个栗子
小益使用 Apache 协议开源了一个 Android 类库,只要小张引用类库时保留了原作者的声明,并对修改的源码进行说明,那后续项目开源与否,都是符合协议的。
3.5 使用此协议的开源项目
hadoop,tomcat
四、BSD 2
4.1 关键词
声明协议
4.2 关键点
再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议
如果再发布的只是二进制类库/软件,则需要在类库/软件的文档那个和版权声明中包含原来代码中的BSD协议
4.3 商业化
允许闭源商业软件的发布和销售
4.4 使用此协议的开源项目
brew
五、BSD 3
5.1 关键词
声明协议
5.2 关键点
相比 BSD 2.0 新增协议如下: 不可以用开源代码的“作者/机构的名字”或“原来产品的名字”做市场推广
5.3 商业化
允许闭源商业软件的发布和销售
5.4 举个栗子
小益使用 BSD 协议开源了一个 Android 类库,只要小张引用类库时保留了原作者的声明,并对修改的源码进行说明,那后续项目开源与否,都是符合协议的。
5.5 使用此协议的开源项目
flask,redis,numpy
六、MIT
6.1 关键词
许可声明
6.2 关键点
软件中必须包含许可声明
6.3 商业化
允许商业化
6.4 举个栗子
小益使用 MIT 协议开源了一个 Android 类库,只要小张引用类库时保留包含了许可声明,那后续项目开源与否,都是符合协议的。
6.5 使用此协议的开源项目
vue,react,bootstrap,vscode,electron,axios,terminal
七、GPL 2.0
7.1 关键词
感染
7.2 关键点
使用 / 修改 / 衍生 GPL 类库的代码或软件,必须也采用 GPL 协议进行开源
项目开源后可以再增加其他开源协议,但是协议必须比 GPL 宽泛
不提供品质担保,使用采用此协议的软件产生的任何后果都不会负责
7.3 商业化
可以用于商业,但是必须开放源码
7.4 举个栗子
小益使用 GPL 协议开源了一个 Android 类库,这个时候小张做开发时,本着不重复造轮子的想法,在项目中引用了小益的类库。项目开发完成以后,小张想把项目上架到 GooglePlay,但是不想开源,这个时候就违反了 GPL 协议。 为了不违反协议,小张索性将项目开源,而在选择开源协议的时候,小张必须选择 GPL 协议。
GPL 的本质就是生生不息,不断衍生。
7.5 使用此协议的的开源项目
Linux,GCC,scapy
八、GPL 3.0
GPL 3.0 相比 2.0 新增了一些条例:
任何向 GPL 项目贡献的成果将永远以 GPL 协议发行
GPL 软件设备的用户有权更改软件
使用此协议的的开源项目
GIMP,Bash,YouCompleteMe
九、LGPL
9.1 关键词
引用类库无需开源
9.2 关键点
LGPL 允许商业软件通过引用(link)的方式使用 LGPL 类库,而不需要开放源代码
但是如果修改或衍生 LGPL 协议代码,则必须采用 LGPL 协议
9.3 商业化
适合商业软件
9.4 举个栗子
小益使用 LGPL 协议开源了一个 Android 类库,小张做开发时引用了此类库。之后小张将项目上架到 GooglePlay 而不开源,是没有违反协议的。但是小张引用类库时,是以源码的形式引用的,那就必须要将项目开源了。
9.5 使用此协议的的开源项目
alibaba/jvm-sandbox
十、AGPL 3.0
10.1 关键词
网络交互
10.2 关键点
AGPL 在 GPL 的基础上,增加了一条限制,通过网络与用户交互,也需要提供源代码
10.3 商业化
可以用于商业,但是必须开放源码
10.4 使用此协议的开源项目
octotree
十一、EPL 2.0
11.1 关键词
修改源码需要开源
11.2 关键点
修改源码后发布需要开源
软件贡献者再次将源码开源发布时,需要使用 EPL 协议,除非得到作者授权
项目中引用了 EPL 协议的代码,项目开源时可以使用其他协议,但是引用的那部分代码仍然需要使用 EPL 协议
11.3 商业化
允许闭源商业软件的发布和销售
11.4 使用此协议的开源项目
che
十二、MPL
12.1 关键词
版权集中
12.2 关键点
修改后的代码版权归软件的发起者,可以免费使用
12.3 商业化
允许闭源商业软件的发布和销售
12.4 举个栗子
小益使用 MPL 协议开源了一个 Android 类库,小张对源码进行修改以后重新发布,修改后的源码版权也属于小益。
12.5 使用此协议的开源项目
syncthing,firefox-ios
如何选择开源协议
如果想省事,不关系别人用自己的代码去做什么,直接选 MIT 或者 BSD 就好
如果想代码修改以后做出声明,选择 Apache 协议
如果想“繁衍”后代,那么使用 GPL 协议
其实看了上述介绍,了解了各个协议之间的区别,我们基本上也就清楚项目该选哪种协议了。如果还不清楚,可参照此网站。
参考
GNU通用公共许可证
GNU General Public License, version 1
GNU通用公共许可协议
LGPL 与GPL的区别
相关文章:
开源协议概览
身为程序员,我们不可避免的要和开源项目打交道,不管是我们自己做了些开源项目,还是使用开源项目,对各种开源协议的了解是必要的。 OSI(Open Source Initiative) OSI,开发源代码组织,是一个旨在推动开源软件…...

分布式缓存
分布式缓存 缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应…...

BSC/平衡记分卡
一、Balanced Score Card BSC即平衡计分卡(Balanced Score Card),是常见的绩效考核方式之一,是从财务、客户、内部运营、学习与成长四个角度,将组织的战略落实为可操作的衡量指标和目标值的一种新型绩效管理体系。 是…...

论文阅读_训练大模型用于角色扮演
英文名称: Character-LLM: A Trainable Agent for Role-Playing 中文名称: 角色-LLM:训练Agent用于角色扮演 文章: [https://arxiv.org/abs/2310.10158](https://arxiv.org/abs/2310.10158) 作者: Yunfan Shao, Linyang Li, Junqi Dai, Xipeng Qiu 机构: 复旦大学…...

v-if控制div内容显示,克隆这个div但是v-if没有效果
问题描述: 我的子页面打印的时候通过isPdf来隐藏“选择参加人员”按钮。 我子页面有个el-dialog,el-dialog里面有个大的div它的id为app-pre-meet-add,在子页面我通过isPdf来显示我想要的内容。现在我在父页面先通过this.$refs.child.control…...
flutter的状态管理学习
文章目录 1.flutter widget分类2. 代理组件又分为3. 状态 state 数据4. 刷新 数据变化5. code 1.flutter widget分类 组合渲染代理 2. 代理组件又分为 Positioned向父组件传递数据InheritedWidget向子组件传递数据 3. 状态 state 数据 状态就是用到了向子组件传递数据ÿ…...
开源免费虚拟化KVM的部署及其虚拟机资源变更、快照、克隆等常见运维操作
实践说明:基于RHEL9(AlmaLinux9.1)部署,同类系统(CentOS9,RockyLinux9等)适用,但适用场景是不限于此的。 文档说明:本文档旨在帮助快速应用KVM虚拟化技术,重在实践操作,提供了简要参考。 文档形成时期&…...
阿里云git clone超时报错解决方法
参考:引用文章...

力扣刷题-二叉树-合并二叉树
617.合并二叉树(经典) 合并二叉树是操作两棵树的题目里面很经典的,如何对两棵树遍历以及处理? 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并…...
了解JavaScript 加密、混淆和生成签名
分析并理解网站的 JavaScript 加密、混淆和生成签名的方法是 JavaScript 逆向工程中的一个重要方面。这些技术通常用于保护代码免遭未授权的访问和修改,或确保数据在传输过程中的安全性。 加密 目的:加密用于保护敏感数据,使得只有拥有正确密…...
Go语言的指针(深度解析)
指针是Go语言中的一个重要概念,它提供了对内存地址的直接访问和操作能力。通过指针,我们可以高效地传递和修改变量的值,避免了值传递所带来的拷贝开销。在本文中,我们将深入探讨Go语言指针的概念、使用方法和注意事项。 指针的本…...

HTB-SAU
信息收集 # cat port.nmap # Nmap 7.94 scan initiated Thu Jan 11 19:26:51 2024 as: nmap -sS --min-rate 10000 -p- -oN port.nmap 10.10.11.224 Nmap scan report for 10.10.11.224 (10.10.11.224) Host is up (0.28s latency). Not shown: 65531 closed tcp ports (r…...

AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点
🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...

Linux的SSH服务
一.SSH服务简介 1.什么是SSH SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应…...

MySQL连续案例续集
01)查询学过「张三」老师授课的同学的信息 SELECT s.*, c.cname, t.tname, sc.score FROM t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc WHERE t.tid c.tid AND c.cid sc.cid AND sc.sid s.sid AND t.tname ‘张三’ 02&#x…...
【STM32读取HX711的函数】
[两个普通IO读取HX711数据的函数-主芯片是STM32F407] 以下是.h文件中的内容: #ifndef __hx711_h #define __hx711_h #define HX711CH1_DIO_GROUP GPIOA #define HX711CH1_CLK_GROUP GPIOA #define HX711CH1_DIO_PIN GPIO_Pin_1 #define HX711CH1_CLK_PIN GPIO_Pin…...
MATLAB对数据隔位抽取和插值的几种方法
对于串行的数据,有时我们需要转成多路并行的数据进行处理,抽取;或者是需要对数据进行隔点抽取,或对数据进行插值处理。此处以4倍抽取或插值为例,MATLAB代码实现。 文章目录 抽取方法一:downsample函数方法…...

[NSSCTF Round#16 Basic] CPR
打着玩玩,比赛很简单。 Crypto pr 一个RSA题,n1p*q,n2q*r给了两个c和p,r而且flag经过pad用单因子无法解出。分别用p,r解完再取crt from Crypto.Util.number import * import randomflagplaintext NSSCTF{****************} charset abcdefghijklmn…...

LAMMPS 文献:9 种熔化温度模拟方法的总结与比较:两相法、单相法以及缺陷法
记录一下检索到一篇通过LAMMPS模拟熔化温度的总结文章:单相方法、过热–过冷方法、Z 方法、修正 Z 方法、孔洞方法、修正孔洞方法、两相方法、夹层方法以及修正两相法。 感谢论文的原作者! 文章题目: A comprehensive investigation on the…...
JSR-107 (JCACHE)
JSR107 Specification 1.1.1 Maintenance Release https://docs.google.com/document/d/1ijduF_tmHvBaUS7VBBU2ZN8_eEBiFaXXg9OI0_ZxCrA/edit?pli1 What is JSR-107? JSR-107 is a standardized API for temporary, in-memory caching in Java applications. It defines a s…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...