当前位置: 首页 > news >正文

开源协议概览

身为程序员,我们不可避免的要和开源项目打交道,不管是我们自己做了些开源项目,还是使用开源项目,对各种开源协议的了解是必要的。

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 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应&#xf…...

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 数据 状态就是用到了向子组件传递数据&#xff…...

开源免费虚拟化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…...

kylin4.0.3升级问题

话接前文: kylin升级(3.0.1->kylin-4.0.3)-CSDN博客文章浏览阅读941次,点赞29次,收藏12次。原本的cube太多了,换其他OLAP数据库太麻烦。相比之下,升级是一个很好的选择(官网有说明内存降低和构…...

【UML】第16篇 活动图

目录 一、什么是活动图 二、应用场景: 三、绘图符号的说明: 四、语法: 五、例图 六、建模的流程 6.1 对业务流程建模时 6.2 对用例进行活动图建模时 一、什么是活动图 活动图(Activity Diagram)是UML中用于描…...

Python学习之路-函数进阶

Python学习之路-函数进阶 参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,一共有4 种组合形式:无参数,无返回值;无参数,有返回值;有参数,无返回值&#xff…...

Mac打包Unix可执行文件为pkg

Mac打包Unix可执行文件为pkg 方式一:通过packages页面打包 1.下载packages app Distribution:自定义化更高,包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目:通过unix可执行文件postinstall.sh脚本实现通过ma…...

C++ 模拟散列表 || 哈希表存储与查询,模版题(拉链法)

维护一个集合,支持如下几种操作: I x,插入一个整数 x ; Q x,询问整数 x 是否在集合中出现过; 现在要进行 N 次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N &#xff0c…...

详解Skywalking 服务Overview页面的参数含义(适合小白)

本文针对刚刚接触skywalking的同学,重点讲解服务Overview页面中各个参数的含义,为大家快速上手skywalking会起到帮助作用! 最重要的三个指标 Service Apdex(数字):当前服务的评分 Successful Rate(数字&a…...

Android studio GridView应用设计

一、xml布局文件设计: <GridViewandroid:id="@+id/gridView"android:layout_width="match_parent"android:layout_height="match_parent"tools:layout_editor_absoluteX="1dp"tools:layout_editor_absoluteY="1dp"andr…...

K8s 是如何完成调度和权重调整?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、调度流程二、kuble-scheduler 调度原理1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析2 修改调度器插件默认权重示例2.1 环境准备2.2 调整Inte…...

计算机毕业设计----Springboot超市订单管理系统

项目介绍 该超市订单管理毕业设计基于jdk8版本开发&#xff0c;在部署时需要使用jdk8以上的版本。使用了目前流行的框架组合springbootmybatis的框架技术&#xff0c; 实现了供应商管理对供应商实现增删改查、订单管理对超市订单实现增删改查、用户管理等功能&#xff0c;适用…...

如何给AI下达精准的指令,哪些提示词对于AI是有效的?

刚上手那会&#xff0c;我倾向于将 prompt 翻译为“指令”&#xff0c;但这并不精确。“指令”通常对应instructions&#xff0c;属于 prompt 中的纯指令部分&#xff0c;通常是一个动宾结构&#xff08;做什么&#xff09;。剩下的部分更多是描述&#xff08;describe&#xf…...