簡(jiǎn)介
使用開(kāi)源代碼可以幫助提高軟件開(kāi)發(fā)效率并節(jié)省成本,但是如果不當(dāng)使用開(kāi)源代碼,也可能給個(gè)人及公司會(huì)帶來(lái)知識(shí)產(chǎn)權(quán)方面的法律風(fēng)險(xiǎn),不僅要花費(fèi)大量的費(fèi)用,有時(shí)候甚至需要公開(kāi)自有的商業(yè)代碼,“賠了夫人又折兵”,給個(gè)人和公司造成極大的損失,所以在商業(yè)軟件使用開(kāi)源代碼前認(rèn)真評(píng)估開(kāi)源代碼所攜帶的許可證顯得尤為重要。
截至2019年6月,國(guó)際開(kāi)源組織OSI(Open Source Initiative)批準(zhǔn)的許可證超過(guò)80種,其中被廣泛使用的許可證包括以下8種:
- Apache License 2.0 (Apache-2.0)
- 3-clause BSD license (BSD-3-Clause)
- 2-clause BSD license (BSD-2-Clause)
- GNU General Public License (GPL)
- GNU Lesser General Public License (LGPL)
- MIT license (MIT)
- Mozilla Public License 2.0 (MPL-2.0)
- Eclipse Public License version 2.0
根據(jù)使用條件的不同,開(kāi)源許可證分為兩大類(lèi),即Permissive許可證和Copyleft許可證。
Permissive許可證
Permissive License(寬松式許可證)允許用戶不經(jīng)許可可以隨意復(fù)制、修改和發(fā)布,但是并不要求分發(fā)時(shí)必須使用相同的許可證,用戶可以在修改代碼后選擇閉源,常見(jiàn)的Apache、BSD、MIT屬于Permissive許可證。
BSD (Berkerley Software Distribution)
BSD許可證給予用戶在使用開(kāi)源代碼方面很大的自由,分為2-Clause(兩條款)和3-Clause(三條款)兩類(lèi),需要遵守以下規(guī)則:
- 如果分發(fā)的軟件包含源代碼,則必須在源代碼中保留原始的BSD許可證聲明。
- 如果分發(fā)的軟件僅包含二進(jìn)制程序,則必須在文檔或版權(quán)說(shuō)明中保留原始的BSD許可證聲明。
- 未經(jīng)許可,不得使用原始作者或機(jī)構(gòu)的名字為軟件做市場(chǎng)推廣。(僅3-Clause需要遵守)
使用BSD許可證的應(yīng)用案例包括:Chromium,Django,F(xiàn)reeBSD,Nginx等。
Apache-2.0
Apache Licence是著名的非盈利開(kāi)源組織Apache采用的協(xié)議,需要遵守以下規(guī)則:
- 必須在源代碼中保留原始的Apache許可證聲明。
- 如果用戶修改了源代碼,需要在被修改的文件中說(shuō)明。
- 在衍生產(chǎn)品中,必須保留原來(lái)代碼中的版權(quán)、專(zhuān)利、商標(biāo)及作者規(guī)定的其他需要包含的說(shuō)明等信息。
- 如果在分發(fā)的軟件中包含Notice文件,則需要在Notice文件中包含Apache許可證聲明。
使用Apache 2.0許可證的應(yīng)用案例包括:Apache家族系列產(chǎn)品,如Hadoop, OpenOffice, Spark,SVN, 以及Swift、Kubernetes、Android Open Source Project (AOSP)等。
MIT (Massachusetts Institute of Technology)
和BSD-2-Clause類(lèi)似,即需要遵守以下規(guī)則:
- 如果分發(fā)的軟件包含源代碼,則必須在源代碼中保留原始的MIT許可證聲明。
- 如果分發(fā)的軟件僅包含二進(jìn)制程序,則必須在文檔或版權(quán)說(shuō)明中保留原始的MIT許可證聲明。
使用MIT許可證的應(yīng)用案例包括:Bootstrap, jQuery, Node.js, Rails等。
Copyleft許可證
Copyright(版權(quán)) 的意思是未經(jīng)許可,用戶無(wú)權(quán)復(fù)制和使用。Copyleft License(反版權(quán)許可證) 作為Copyright的反義詞,意為未經(jīng)許可,用戶也可以隨意復(fù)制、修改和發(fā)布,但要求分發(fā)者必須使用相同的許可證發(fā)布修改后的衍生作品,以保證衍生作品也能被其他人自由使用,常見(jiàn)的AGPL, GPL, LGPL, MPL屬于Copyleft許可證。
GPL 2.0
只要軟件中引用及修改了GPL代碼或者鏈接了GPL類(lèi)庫(kù),整個(gè)軟件就就必須遵循GPL,不僅需要公開(kāi)所有源碼,并且允許他人可以自由地復(fù)制和分發(fā)。
使用GPLv2許可證的應(yīng)用案例包括:Linux內(nèi)核、MySQL等。
GPL 3.0
GPLv3包含了明確的專(zhuān)利許可以及添加了對(duì)數(shù)字版權(quán)管理和加密簽名的限制,不僅要求用戶公開(kāi)源碼,還要求公布相關(guān)硬件及必要的安裝信息。
GPLv3能與更多的許可證兼容,例如Apache 2.0,但這個(gè)兼容是單向的,即GPLv3許可證的項(xiàng)目中可以包含Apache 2.0的開(kāi)源代碼,但是Apache許可證的項(xiàng)目不能包含GPLv3的開(kāi)源代碼。值得注意的是,GPLv3與GPLv2卻并不兼容,即一個(gè)項(xiàng)目中不能同時(shí)包含GPLv2和GPLv3的代碼,但是,如果軟件以GPL “v2或更高版本”許可證發(fā)布,則與GPLv3兼容。
使用GPLv3許可證的應(yīng)用案例包括:GCC,Emacs等。
AGPL
AGPL是對(duì)GPL的補(bǔ)充,如果使用了AGPL代碼的軟件是一個(gè)網(wǎng)絡(luò)應(yīng)用,那么這個(gè)軟件的所有源碼和修改代碼也必須開(kāi)源,除非購(gòu)買(mǎi)了該AGPL代碼的商業(yè)授權(quán)。
使用AGPL許可證的應(yīng)用案例包括:BerkeleyDB,MongoDB (2018年10月前發(fā)布的版本),Wiki.js等。
LGPL
和GPL相比,LGPL限制更少,是一個(gè)主要為類(lèi)庫(kù)使用設(shè)計(jì)的開(kāi)源協(xié)議,需要遵守以下規(guī)則:
- 如果軟件通過(guò)動(dòng)態(tài)鏈接的方式使用LGPL類(lèi)庫(kù),則該軟件不需要開(kāi)源。
- 如果軟件通過(guò)靜態(tài)鏈接的方式使用LGPL類(lèi)庫(kù),則軟件作者必須提供程序的二進(jìn)制目標(biāo)文件(不需要提供源代碼),以便用戶有機(jī)會(huì)更新LGPL類(lèi)庫(kù)并重新鏈接到該程序。
- 如果修改了LGPL的源碼或者衍生了新的代碼,則所有修改后及衍生的代碼也必須遵循LGPL許可證。
使用LGPL許可證的應(yīng)用案例包括:7-Zip,GLib,uClibc等。
MPL (Mozilla Public License)
MPL License由Mozilla基金會(huì)開(kāi)發(fā)并維護(hù),介于BSD(衍生代碼可以閉源)和GPL(衍生代碼必須以GPL方式開(kāi)源)之間,最新發(fā)布的2.0版以更簡(jiǎn)潔和更好的兼容其他協(xié)議為目標(biāo),鼓勵(lì)企業(yè)和開(kāi)源社區(qū)為開(kāi)發(fā)核心軟件做更多貢獻(xiàn)。使用MPL源碼需要遵守以下規(guī)則:
- 如果修改了MPL的源碼或者衍生了新的代碼,并且以源代碼方式發(fā)布的文件,則所有修改后及衍生的代碼也必須遵循MPL許可證。
- 如果用戶自有的源碼通過(guò)專(zhuān)用接口訪問(wèn)MPL的源碼及類(lèi)庫(kù),則包含專(zhuān)用接口的代碼必須遵循MPL許可證,用戶自有源碼不必遵循MPL許可證。
- 用戶獲得MPL代碼中的專(zhuān)利許可,但是不能使用其原始商標(biāo)。
使用MPL許可證的應(yīng)用案例包括:Mozilla Firefox, Mozilla Thunderbird, Apache Flex, LibreOffice等。
EPL (Eclipse Public License)
EPL License由Eclipse基金會(huì)開(kāi)發(fā)并維護(hù),在CPL基礎(chǔ)上刪除了專(zhuān)利相關(guān)訴訟的限制條款。EPL比GPL許可證更為寬松,并且與GPL并不兼容。使用EPL源碼需要遵守以下規(guī)則:
- 如果修改了EPL的源碼或者衍生了新的代碼,并且以源代碼方式分發(fā),則所有修改后及衍生的代碼也必須遵循EPL許可證。
- 如果軟件以二進(jìn)制目標(biāo)文件的形式分發(fā),則需要聲明可以根據(jù)請(qǐng)求向其他用戶提供源代碼。
- 用戶獲得EPL代碼中的專(zhuān)利許可。
使用EPL許可證的應(yīng)用主要為Eclipse基金會(huì)名下的軟件,如著名的集成開(kāi)發(fā)工具 - Eclipse。
應(yīng)用實(shí)例
MariaDB
MariaDB是目前最受關(guān)注的MySQL數(shù)據(jù)庫(kù)衍生版,由開(kāi)源社區(qū)開(kāi)發(fā)和維護(hù),誕生于Oracle收購(gòu)MySQL后,目標(biāo)是成為MySQL的替代品。
MariaDB的服務(wù)端使用的是GPL v2許可證,如果軟件只是內(nèi)部使用,并且沒(méi)有被包含在對(duì)外發(fā)布的產(chǎn)品中,這種情況不被視為分發(fā),可以自由使用;如果軟件用于對(duì)外發(fā)布,使用了服務(wù)端的GPL代碼或者通過(guò)鏈接的方式使用了客戶端的GPL動(dòng)態(tài)庫(kù),或者軟件與MariaDB數(shù)據(jù)庫(kù)強(qiáng)綁定,即在沒(méi)有安裝MariaDB數(shù)據(jù)庫(kù)的情況下,軟件無(wú)法運(yùn)行或者只能使用非常少的功能,該軟件也必須遵循GPL許可協(xié)議;但是如果該軟件通過(guò)第三方獨(dú)立框架訪問(wèn)數(shù)據(jù)庫(kù),
MariaDB的C/JAVA/ODBC的客戶端動(dòng)態(tài)庫(kù)使用了LGPL許可證,軟件也只需遵循LGPL協(xié)議,可以自由使用這些動(dòng)態(tài)庫(kù),不存在必須開(kāi)源的問(wèn)題。
如果軟件通過(guò)調(diào)用非GPL的連接器與MariaDB數(shù)據(jù)庫(kù)進(jìn)行通信,例如:mysqlnd for PHP, ruby-mysql等,軟件只需要遵循該連接器所使用的許可證。如果軟件通過(guò)第三方獨(dú)立的框架訪問(wèn)數(shù)據(jù)庫(kù),即使框架中使用了包含GPL許可證的模塊,例如:ODBC, JDBC, Perl,PHP PDO等,軟件本身并不受其影響,不需要遵循GPL許可證。如果發(fā)布的軟件除了可以訪問(wèn)MariaDB數(shù)據(jù)庫(kù)之外,還可以訪問(wèn)其他數(shù)據(jù)庫(kù),即MariaDB在軟件中不屬于必須項(xiàng),在這種情況下該軟件可以和MariaDB一起自由發(fā)布,同樣不需要遵循GPL許可證。
如果軟件中必須使用數(shù)據(jù)庫(kù)服務(wù)端的相關(guān)代碼,又不希望自己的商業(yè)代碼遵循GPL許可證,可以考慮以下三種方案:
- 使用類(lèi)似MIT/BSD許可證的PostGreSQL作為替代產(chǎn)品。
- 更換為不使用SQL作為查詢語(yǔ)言的NoSQL非關(guān)系數(shù)據(jù)庫(kù)方案,例如:Cassandra (Apache 2.0), Redis (BSD-3-Clause), 或者 CouchDB (Apache 2.0)等。
- 付費(fèi)購(gòu)買(mǎi)帶有商業(yè)許可證的軟件,如MySQL, MongoDB等。
Linux Kernel
Linux內(nèi)核以GPL v2許可證發(fā)行,所以任何Linux內(nèi)核的衍生產(chǎn)品也必須遵循GPL許可證進(jìn)行發(fā)布。如下圖所示的應(yīng)用實(shí)例,我們列出其中違反GPL許可證的使用方法(紅線所示)。
- 應(yīng)用程序通過(guò)靜態(tài)或動(dòng)態(tài)鏈接的方式使用GPL類(lèi)庫(kù),會(huì)導(dǎo)致整個(gè)應(yīng)用也必須以GPL許可證方式發(fā)布。規(guī)避方法是主程序通過(guò)LPC或者RPC間接調(diào)用GPL庫(kù)里的接口,或者改用動(dòng)態(tài)鏈接LGPL類(lèi)庫(kù)的方式。
- 應(yīng)用程序通過(guò)非標(biāo)準(zhǔn)接口直接訪問(wèn)Linux內(nèi)核的行為,會(huì)導(dǎo)致整個(gè)應(yīng)用也必須以GPL許可證方式發(fā)布。規(guī)避方法是通過(guò)Linux 內(nèi)核提供的標(biāo)準(zhǔn)接口函數(shù)訪問(wèn)Linux內(nèi)核,用戶空間的程序及類(lèi)庫(kù)的普通系統(tǒng)調(diào)用不被視為L(zhǎng)inux內(nèi)核的衍生產(chǎn)品,應(yīng)用程序不需要遵循GPL許可證。
- 可加載內(nèi)核模塊(LKM)是用戶編寫(xiě)的軟件,它與Linux內(nèi)核緊密綁定,運(yùn)行在內(nèi)核地址空間中,Linux內(nèi)核開(kāi)發(fā)社區(qū)認(rèn)為L(zhǎng)KM程序應(yīng)該遵循GPL許可證。但是不少硬件廠商出于保護(hù)商業(yè)機(jī)密及知識(shí)產(chǎn)權(quán)的角度出發(fā),在這一點(diǎn)與Linux內(nèi)核開(kāi)發(fā)社區(qū)一直存在爭(zhēng)議,硬件廠商一般都會(huì)以二進(jìn)制目標(biāo)文件的方式單獨(dú)發(fā)布硬件驅(qū)動(dòng)試圖規(guī)避GPL風(fēng)險(xiǎn),但是始終存在潛在的法律風(fēng)險(xiǎn)以及開(kāi)源帶來(lái)的的商業(yè)影響,降低風(fēng)險(xiǎn)的方法就是同樣以GPL或者其他與GPL兼容的許可證發(fā)布LKM程序,并且不要把那些不希望開(kāi)源的的私有代碼直接鏈接到LKM程序。
小結(jié)
由于GPL嚴(yán)格要求使用了GPL代碼或類(lèi)庫(kù)的軟件產(chǎn)品必須使用GPL協(xié)議,所以商業(yè)軟件最好不要使用GPL許可證的產(chǎn)品。開(kāi)源許可證既保護(hù)代碼作者,對(duì)他人使用代碼產(chǎn)生的風(fēng)險(xiǎn)免責(zé);同時(shí)也保護(hù)代碼使用者,了解使用開(kāi)源代碼的權(quán)利及必須履行的義務(wù),規(guī)避將來(lái)可能的法律風(fēng)險(xiǎn)。