开源软件在追求“自由”的同时,不能牺牲程序员的利益,否则将会影响程序员的创造激情,因此世界上现在有 60 多种被开源促进组织(Open Source Initiative)认可的开源许可协议来保证开源工作者的权益。

开源协议规定了你在使用开源软件时的权利和责任,也就是规定了你可以做什么,不可以做什么。

开源协议虽然不一定具备法律效力,但是当涉及软件版权纠纷时,开源协议也是非常重要的证据之一。

对于准备编写一款开源软件的开发人员,也非常建议先了解一下当前最热门的开源许可协议,选择一个合适的开源许可协议来最大限度保护自己的软件权益。

1) GNU GPL(GNU General Public License,GNU通用公共许可证)

只要软件中包含了遵循 GPL 协议的产品或代码,该软件就必须也遵循 GPL 许可协议,也就是必须开源免费,不能闭源收费,因此这个协议并不适合商用软件。

遵循 GPL 协议的开源软件数量极其庞大,包括 Linux 系统在内的大多数的开源软件都是基于这个协议的。

GPL 开源协议的主要特点
特点 说明
复制自由 允许把软件复制到任何人的电脑中,并且不限制复制的数量。
传播自由 允许软件以各种形式进行传播。
收费传播 允许在各种媒介上出售该软件,但必须提前让买家知道这个软件是可以免费获得的;因此,一般来讲,开源软件都是通过为用户提供有偿服务的形式来盈利的。
修改自由 允许开发人员增加或删除软件的功能,但软件修改后必须依然基于GPL许可协议授权。

2) BSD(Berkeley Software Distribution,伯克利软件发布版)协议

BSD 协议基本上允许用户“为所欲为”,用户可以使用、修改和重新发布遵循该许可的软件,并且可以将软件作为商业软件发布和销售,前提是需要满足下面三个条件:

  • 如果再发布的软件中包含源代码,则源代码必须继续遵循 BSD 许可协议。
  • 如果再发布的软件中只有二进制程序,则需要在相关文档或版权文件中声明原始代码遵循了 BSD 协议。
  • 不允许用原始软件的名字、作者名字或机构名称进行市场推广。

BSD 对商业比较友好,很多公司在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,甚至在必要的时候可以修改或者二次开发。

3) Apache 许可证版本(Apache License Version)协议

Apache 和 BSD 类似,都适用于商业软件。Apache 协议在为开发人员提供版权及专利许可的同时,允许用户拥有修改代码及再发布的自由。

现在热门的 Hadoop、Apache HTTP Server、MongoDB等项目都是基于该许可协议研发的,程序开发人员在开发遵循该协议的软件时,要严格遵守下面的四个条件:

  • 该软件及其衍生品必须继续使用 Apache 许可协议。
  • 如果修改了程序源代码,需要在文档中进行声明。
  • 若软件是基于他人的源代码编写而成的,则需要保留原始代码的协议、商标、专利声明及其他原作者声明的内容信息。
  • 如果再发布的软件中有声明文件,则需在此文件中标注 Apache 许可协议及其他许可协议。

4) MIT(Massachusetts Institute of Technology)协议

目前限制最少的开源许可协议之一(比 BSD 和 Apache 的限制都少),只要程序的开发者在修改后的源代码中保留原作者的许可信息即可,因此普遍被商业软件所使用。

使用 MIT 协议的软件有 PuTTY、X Window System、Ruby on Rails、Lua 5.0 onwards、Mono 等。

5) GUN LGPL(GNU Lesser General Public License,GNU 宽通用公共许可证)

LGPL 是 GPL 的一个衍生版本,也被称为 GPL V2,该协议主要是为类库设计的开源协议。

LGPL 允许商业软件通过类库引用(link)的方式使用 LGPL 类库,而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改 LGPL 协议的代码或者衍生品,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

如何选择开源协议

世界上的开源协议有上百种(有兴趣的读者,可以访问http://www.gnu.org/licenses/license-list.html),很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议——GPL、BSD、MIT、Mozilla、Apache 和 LGPL——之中做选择,也很复杂。

乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择开源协议,大家看了一目了然,真是清爽。

开源协议有哪些?如何选择开源协议?相关推荐

  1. 【学习笔记】数据链路层——流量控制:停止等待协议、后退N帧协议(GBN)、选择重传协议(SR)

    文章目录 一. 流量控制 ① 必要性 ② 数据链路层 VS 传输层 ③ 定义 ④ 方法 1)停止等待协议 2)滑动窗口协议 关系: 包括: 3)协议对比 二. 停止-等待协议 必要性 应用情况 ① 无 ...

  2. 选择重传协议(SR)

    GBN协议的弊端: 选择重传协议中的滑动窗口:[自行百度] SR发送方必须响应的三件事: 1,上层的调用 2,收到了一个ACK 3,超时事件 SR接收方要做的事情: 运行中的SR: 滑动窗口长度: S ...

  3. 王道考研 计算机网络11 数据链路层 封装成帧 透明传输 流量控制 停止-等待协议 后退N帧协议GBN 选择重传协议SR

    第三章知识 数据链路层的基本概念 数据链路层功能概述 封装成帧 透明传输 什么数据都能传输 数据链路层的流量控制 流量控制方法 滑动窗口协议: 每一个小格标识一个帧 发送窗口:发送端正在处理的发送的数 ...

  4. 3.2计算机网络(停止-等待协议 后退N帧协议 选择重传协议)

    目录 1.停止-等待协议 1.概念 2.停等协议--无差错情况 3.停等协议--有差错情况 1.数据帧丢失或检测到帧出错 2.ACK(确认帧)丢失 3.ACK(确认帧)迟到 4.停等协议性能分析 5. ...

  5. GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别

    个人开发者到底选择GPL协议还是MIT协议? 为什么小米可以避开开源协议? 安卓是开源的,为什么华为还要自己造鸿蒙? 你知道史上最奇葩的开源协议吗? 这些问题,都将在这篇文章中找到答案. 目录 GPL ...

  6. GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别!

    个人开发者到底选择GPL协议还是MIT协议? 为什么小米可以避开开源协议? 安卓是开源的,为什么华为还要自己造鸿蒙? 你知道史上最奇葩的开源协议吗? 这些问题,都将在这篇文章中找到答案. 开源,是很多 ...

  7. 开源软件发展的保障:分发协议

    前不久,4月26日,是 世界知识产权日.知识产权日旨在促进人们树立尊重知识.崇尚科学和保护知识产权的意识,营造鼓励创新和保护知识产权的法律环境. 在4月28日,我们发布了来自BlenderCN社区罗聪 ...

  8. 遵循gpl协议 采用jar包_开源协议适用范围及其对软件著作权侵权判定的影响

    北京阳光知识产权调解中心 开源不是免费的午餐,开源软件不是公共领域软件,其享有著作权并受著作权法保护,不可以任意使用. 作者 | 罗瑞雪 来源 |<中国版权> 开源软件并不排斥著作权保护, ...

  9. 【开源协议】关于6种开源协议的说明(GPL,LGPL,BSD,MIT,Apache)

    关于开源协议的说明 前言 开源协议分为 宽松型 和 著作权型. 如何选择? 开源协议(GPL,LGPL,BSD,MIT,Apache)的说明 1. GPL 2.LGPL 3. BSD开源协议 4.MI ...

最新文章

  1. ***:***之路的必备技能
  2. python3 判断数据类型
  3. 两道递推公式题的解题报告
  4. 互斥锁在python中的应用
  5. linux下基于jrtplib库的实时传送实现
  6. Thread的run()与start()的区别
  7. lucene分布式索引
  8. 如何设置win7系统分辨率
  9. 飞秋2010下载不仅野草是如此
  10. 学习日报 1028 分支结构 if分支语句
  11. Vivado设计流程(五)工程实现
  12. efs解密-Advanced EFS Data Recovery2.1-含注册KEY
  13. mybatis update返回值的意义
  14. 怎么设置qq信息同步服务器,王者荣耀QQ消息同步功能是什么 王者荣耀QQ消息同步功能介绍...
  15. vue3中获取dom元素和操作
  16. 计算机组成原理 透明性,计算机组成原理试题
  17. Java中的servlet是什么?
  18. 万年历插件软件测试,万年历的程序代码
  19. 【字体分享】适合寒露闪屏设计的字体有哪些?
  20. VS2008当前页面脚本发生错误

热门文章

  1. 快速掌握的微信运营技巧
  2. LeedCode 172. 阶乘后的零
  3. 【计算机网络】第一章:体系结构
  4. 参数化,断言,参数化时为什么做断言,怎么做断言,如何确保断言的正确
  5. Android系统的Ashmem匿名共享内存子系统分析(4)- Ashmem子系统的 Java访问接口
  6. winserver修改计算机用户名,windows10系统更改账户名称的方法
  7. 【LeetCode每日一题】810. 黑板异或游戏
  8. java 事件流_JDK14的新特性:JFR,JMC和JFR事件流
  9. PHP图片验证码无法显示的解决方案
  10. [2019长沙长郡中学集训]加法