摘要:license,中文译为“许可证”。在开源世界里,license是具有法律效力的,通过选择相应的license,版权拥有者可以声称自己相应的权利,包括其他人使用、修改、引用、共享等一系列涉及版权的操作。

01 开源license,是啥?

场景:壮壮是一个程序员,他最近开发了一个小功能,并且将代码放到了github上。过了一段时间,壮壮发现,好多人引用他的代码,但没有声称他的著作权,壮壮觉得很气愤,且不理解:为什么大家这么不尊重我的劳动成果呢?所以他就问他的好朋友小源同学,小源同学了解情况后,告诉他:是因为你没有采用符合你需求的license啊!

license,中文译为“许可证”。在开源世界里,license是具有法律效力的,通过选择相应的license,版权拥有者可以声称自己相应的权利,包括其他人使用、修改、引用、共享等一系列涉及版权的操作。

实际上,目前国际上公认的开源许可证有80余种,如果对开源了解不多的人,确实会觉得仅许可证一项就很复杂,但在实际使用许可证时,我们可以将使用场景归纳一下,并且将一些常用的许可证种类列举并解释,就极大的方便开发者选用合适的许可证了。下面一道就梳理一下那些常用的许可证~

02 开源license,咋用?

故事:Stallman是自由软件之父,他在上世纪八十年代开发GNU系统时,创造了Copyleft一词,用以区分商业公司copyright。实际上,在上世纪七、八十年代,就已经有相当一部分开源许可证被发布出来,供开源软件选择使用。

如上图所示:Copyright是目前商业公司采用的版权保护办法,旨在杜绝用户之间通过复制、分发等形式,共享产品,造成商业利益的损失;

Public domain则属于另一极端,即在未声明任何license的情况下,著作者与著作物不存在任何关联。

我们所讲的开源license,则集中在Copyleft和Permissive两类情况中,具化来讲,可以理解为:

Copyleft:衍生代码必须开源,且采用相同的开源license;

Permissive:衍生代码不必开源,可采用不同的开源license;

所以,作为代码的生产者,无论是个人抑或是公司,可以确立自身在面对开源时的原则,进而能够确定自身所选定的license类型。

03 开源license,有哪些?

如前文所述,国际公认的开源license,有多达80余种,理解起来殊无必要。只要掌握常用的几类,在需要的时候,采用相应的license,即可解决许可证相关问题。

至于更多的时间精力,不如留给继续coding或者撩妹~

1GPL

全称为General Public License,是Stallman老爷子在鼓捣GNU时所采用的开源协议。GPL最特殊的一点在于:只要一个软件使用了GPL协议的产品,则该软件也必须采用GPL协议,即衍生或修改后的代码,不可用于闭源的商业软件销售和发布。

这种特性,使得GPL具有病毒的特性——传染性。但GPL的传染是为了所有相关代码能够开放,使更多人受益。

2BSD

全称为Berkeley Software Distribution,是一个较为宽松的开源协议,唯一关注的是保护代码作者的著作权要受到尊重,这给予使用者很大的自由度。在满足二次发布时需要声明原来代码的BSD协议及不将原作者/产品用作市场推广时,,使用者可以自由的使用、修改源码,甚至在源码基础上二次开发后进行商用发布和销售。

3MIT

全称为Massachusetts Institution of Technology,又名“X条款”,MIT与BSD较为类似,差异较小。仅提供版权保护和声明,即在二次开发后的发行版中,需要包含原许可证声明。

4MPL

全称为Mozilla Public License,是网景公司的Mozilla小组于1998年设计的软件许可证。该许可证介于GPL和BSD之间,是为了更好的平衡“开发者对源码的需求和他们利用源代码获得的收益”。比如MPL协议下,可以通过折中办法,隐藏具有商业诉求的源代码,为商用场景提供了许可。MPL协议规定较为详细,感兴趣的读者可以自行搜索该协议,作进一步的研究。

5Apache License 2.0

没错,该许可协议就是来自于大名鼎鼎的Apache Software Foundation,总体来说,该许可协议与BSD/MIT协议类似,属于比较宽松、商业友好的开源协议。只需要使用者在使用了该协议下的源代码后, 再发布后,依然带有对源代码的协议、商标、及其他作者规定的说明,即可。

6LGPL

全称为Lesser General Public License,亦称GPL V2,虽然它与GPL同出一处,但他具有不同性:LGPL 允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。但如果是修改LGPL的代码或者衍生的代码,则所有修改或衍生的代码,均需要遵循LGPL协议。

04 开源license,用哪个?

开源license,并没有严格地讲孰优孰劣,只有在根据实际的使用场景,才能明确开源license的最佳选择。

“道理我都懂,可还是过不好这一生”,那么不妨,我们从两个小故事中窥探开源license的真假浮沉吧~~

故事一

2016年5月,Facebook开源了自身的前端软件React,引来业界震动。

7月,Facebook在React开源许可协议中的附加专利条款开始引发争议。

11月,Facebook官方澄清附加专利条款,但并未获得认同,业界仍然忧心忡忡。

2017年7月,Apache基金会禁止使用遵循BSD+附加专利条款的jar包。

同时,中国互联网的一批企业开始意识到问题严重性,并且积极抵制该协议,并且寻求新的前端技术以替代React。

10月,Facebook迫于压力,宣布将react及其他一系列采用BSD+专利许可协议的软件改用MIT许可协议。

点评:BSD+专利许可协议的精髓是“如果你觉得Facebook侵犯了你的知识产权,你不能起诉Facebook;如果Facebook起诉你,那么你不能反诉,否则你就立即停止使用React”。

瞧瞧!小扎很精明嘛!

可惜!群众也不傻呀!

故事二

2009年,甲骨文宣布收购SUN公司。本来是一件正常的商业行为,但却有一个人坚决反对,他就是Michael Widenius——MySQL的创始人。可他为什么反对呢?

因为MySQL是SUN公司所有,一旦被收购,就将属于Oracle公司。而众所周知,Oracle和MySQL那可是死敌啊!MySQL的未来境遇,可想而知。于是Michael Widenius甚至发起了万人签名,提交请愿书,要求欧盟委员会否决这项交易。

当然,历史的进程已经表明:SUN还是被Oracle收购了;MySQL并没有因此而死掉;这又是为什么呢?

因为MySQL采用的是GPL协议,按照该协议:任何源码的衍生产品,如果对外发布,都必须采用相同的许可协议。即我们前边提到的“传染性”。也就是说,在MySQL已经被广泛采用的情况下,使用的GPL协议,反而成为了他最好的保护伞,因为即使Oracle公司废弃MySQL,其他企业或个人依然可以发布MySQL的最新版本和特性;从另外一个角度讲,Oracle公司舍不得MySQL的规模和技术,如果在此基础上进行修改,则二次发布的产品因为GPL协议的传染性,也不得不采用该协议,依然使得MySQL或者重生。

但如果MySQL一开始使用的是MIT/BSD等协议,那么Oracle很容易将MySQL并入自己的商业产品中,并且通过一系列新的特性和功能,使得开源版本被边缘化。

回过头看,开源协议之威力,竟至于斯!

05 写在最后:简单粗暴的选择你的开源协议

乌克兰程序员Paul Bagwell画了一张分析图,介绍了最为流行的几种开源license的实际使用情况。国内技术牛人汉化过来,贴在此处,供大家参考。

扒一扒开源世界有哪些licenses?的更多相关文章

  1. 扒一扒spring,dom4j实现模拟实现读取xml

    今天leadr提出需求,原来公司项目中读取解析xml文件的代码效率太低,考虑切换一种xml为数据封装格式与读取方式以提高效率.我这灵机一动spring对bean的依赖注入就是读取xml文件,可以尝试扒 ...

  2. 自定义View系列教程03--onLayout源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  3. Javascrpt无刷新文件上传

    最近工作中遇到上传文件问题,主要需求是一步点击上传,兼容ie8+,当时用的dojox/form/uploader控件,这两天扒了一下源码,明白了原理拿出来分享一下. 总体思路如下: 1.对于支持XML ...

  4. Sea.js创始人玉伯的前端开发之路

    在Web应用程序的用户体验越来越被重视的今天,前端开发的地位也上升到了前所未有的高度,而随之而来的也有更多的挑战. 为了将前端开发者繁重的工作变得简单,框架应运而生.国内也不乏一些非常优秀的前端开发框 ...

  5. Java的JXL操作xls形式

    jxl这是一个韩国的写作java操作excel工具, 源世界中,有两套比較有影响的API可供使用.一个是POI,一个是jExcelAPI.当中功能相对POI比較弱一点.但jExcelAPI对中文支持非 ...

  6. 说说Request.Params[key]和Request[key]

    摘要 其实你一看到,就应该会想到,这个不简单吗,不就是服务端接收参数的一种方式吗?是的.在asp.net编程中,QueryString.Form.Cookie是三种比较常见的接收客户端参数的方式.Qu ...

  7. Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

    本文由“猫爸iYao”原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样:   ▲ 微信群聊界面里的@人功能    ▲ QQ群聊界面里 ...

  8. jQuery运行方式818

    我们平时打开JQ源码就会看到这么一段代码 (function (window, undefined) { //JQ代码 })(window) 有一点经验的朋友会知道这是js自执行函数 它的好处主要作用 ...

  9. Future接口和FutureTask类【FutureTask实现了Runnable和Future接口】

    Future API: public interface Future<V> { /** * Attempts to cancel execution of this task. This ...

随机推荐

  1. robotframework中的try exception。断言失败后,后面语句能继续执行

    1.在robot中,断言有时会失败,但不想影响后面语句的执行,这时候要用到 Run Keyword And Continue On Failure

  2. jenkins+svn+python+appium启动+mail+html报告

    第一步:jenkins从svn中获取最新的测试代码 1.jenkins启动,进入jenkins目录,使用“java -jar jenkins.war”启动(安装后,jenkins已自启动,不用再自己启 ...

  3. Feature Extractor[VGG]

    0. 背景 Karen Simonyan等人在2014年参加Imagenet挑战赛的时候提出的深度卷积神经网络.作者通过对2013年的ILSVRC中最好的深度神经网络模型(他们最初的对应模型都是ale ...

  4. oracle expdp导出时报 ora-39070:无法打开日志文件

    在通过expdp导出命令导出某个用户的对象时出现以下截图错误: ORA-39002:操作无效 ORA-39070:无法打开日志文件 ORA-39087:目录名<directory>无效 该 ...

  5. SQL Server 分析函数和排名函数

    分析函数基于分组,计算分组内数据的聚合值,经常会和窗口函数OVER()一起使用,使用分析函数可以很方便地计算同比和环比,获得中位数,获得分组的最大值和最小值.分析函数和聚合函数不同,不需要GROUP ...

  6. [UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)

    1. 前言 之前介绍过依赖属性和附加属性的代码段,这两个代码段我用了很多年,一直都帮了我很多.不过这两个代码段我也多年没修改过,Resharper老是提示我生成的代码可以修改,它这么有诚意,这次就只好 ...

  7. xampp 使用过程中刚遇到的问题记录

    开始使用XAMPP的时候,都是可以正常连接的,但是过一段时间后,在用它创建表或其他操作,会报错,提示如下错误 Access denied for user ''@'localhost' to data ...

  8. vue webpack打包 -webkit-box-orient 失效

    一行省略 overflow: hidden; white-space: nowrap; text-overflow: ellipsis; 超出两行省略 overflow: hidden; text-o ...

  9. Jenkins - Extended E-mail配置教程

    前言: 在Jenkins的使用中邮件提醒是一个常用功能,Extended E-mail Notification是一个功能更为齐全,使用也更为复杂的插件,本文即将为大家详细讲解如何配置相关内容,感兴趣 ...

  10. 动态规划-LCS最长公共子序列

    #include<iostream> #include<cstdio> #include<cstring> #include<string> using ...