簡介
使用開源代碼可以幫助提高軟件開發(fā)效率并節(jié)省成本泄朴,但是如果不當使用開源代碼,也可能給個人及公司會帶來知識產(chǎn)權方面的法律風險,不僅要花費大量的費用隅居,有時候甚至需要公開自有的商業(yè)代碼,“賠了夫人又折兵”趁曼,給個人和公司造成極大的損失军浆,所以在商業(yè)軟件使用開源代碼前認真評估開源代碼所攜帶的許可證顯得尤為重要。
截至2019年6月挡闰,國際開源組織OSI(Open Source Initiative)批準的許可證超過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ù)使用條件的不同掰盘,開源許可證分為兩大類摄悯,即Permissive許可證和Copyleft許可證。
Permissive許可證
Permissive License(寬松式許可證)允許用戶不經(jīng)許可可以隨意復制愧捕、修改和發(fā)布奢驯,但是并不要求分發(fā)時必須使用相同的許可證,用戶可以在修改代碼后選擇閉源次绘,常見的Apache瘪阁、BSD、MIT屬于Permissive許可證邮偎。
BSD (Berkerley Software Distribution)
BSD許可證給予用戶在使用開源代碼方面很大的自由管跺,分為2-Clause(兩條款)和3-Clause(三條款)兩類,需要遵守以下規(guī)則:
- 如果分發(fā)的軟件包含源代碼禾进,則必須在源代碼中保留原始的BSD許可證聲明豁跑。
- 如果分發(fā)的軟件僅包含二進制程序,則必須在文檔或版權說明中保留原始的BSD許可證聲明泻云。
- 未經(jīng)許可艇拍,不得使用原始作者或機構的名字為軟件做市場推廣。(僅3-Clause需要遵守)
使用BSD許可證的應用案例包括:Chromium宠纯,Django卸夕,F(xiàn)reeBSD,Nginx等婆瓜。
Apache-2.0
Apache Licence是著名的非盈利開源組織Apache采用的協(xié)議快集,需要遵守以下規(guī)則:
- 必須在源代碼中保留原始的Apache許可證聲明。
- 如果用戶修改了源代碼勃救,需要在被修改的文件中說明碍讨。
- 在衍生產(chǎn)品中,必須保留原來代碼中的版權蒙秒、專利勃黍、商標及作者規(guī)定的其他需要包含的說明等信息。
- 如果在分發(fā)的軟件中包含Notice文件晕讲,則需要在Notice文件中包含Apache許可證聲明覆获。
使用Apache 2.0許可證的應用案例包括:Apache家族系列產(chǎn)品马澈,如Hadoop, OpenOffice, Spark,SVN, 以及Swift弄息、Kubernetes痊班、Android Open Source Project (AOSP)等。
MIT (Massachusetts Institute of Technology)
和BSD-2-Clause類似摹量,即需要遵守以下規(guī)則:
- 如果分發(fā)的軟件包含源代碼涤伐,則必須在源代碼中保留原始的MIT許可證聲明。
- 如果分發(fā)的軟件僅包含二進制程序缨称,則必須在文檔或版權說明中保留原始的MIT許可證聲明凝果。
使用MIT許可證的應用案例包括:Bootstrap, jQuery, Node.js, Rails等。
Copyleft許可證
Copyright(版權) 的意思是未經(jīng)許可睦尽,用戶無權復制和使用器净。Copyleft License(反版權許可證) 作為Copyright的反義詞,意為未經(jīng)許可当凡,用戶也可以隨意復制山害、修改和發(fā)布,但要求分發(fā)者必須使用相同的許可證發(fā)布修改后的衍生作品沿量,以保證衍生作品也能被其他人自由使用浪慌,常見的AGPL, GPL, LGPL, MPL屬于Copyleft許可證。
GPL 2.0
只要軟件中引用及修改了GPL代碼或者鏈接了GPL類庫欧瘪,整個軟件就就必須遵循GPL眷射,不僅需要公開所有源碼,并且允許他人可以自由地復制和分發(fā)佛掖。
使用GPLv2許可證的應用案例包括:Linux內(nèi)核妖碉、MySQL等。
GPL 3.0
GPLv3包含了明確的專利許可以及添加了對數(shù)字版權管理和加密簽名的限制芥被,不僅要求用戶公開源碼欧宜,還要求公布相關硬件及必要的安裝信息。
GPLv3能與更多的許可證兼容拴魄,例如Apache 2.0冗茸,但這個兼容是單向的,即GPLv3許可證的項目中可以包含Apache 2.0的開源代碼匹中,但是Apache許可證的項目不能包含GPLv3的開源代碼夏漱。值得注意的是,GPLv3與GPLv2卻并不兼容顶捷,即一個項目中不能同時包含GPLv2和GPLv3的代碼挂绰,但是,如果軟件以GPL “v2或更高版本”許可證發(fā)布服赎,則與GPLv3兼容葵蒂。
使用GPLv3許可證的應用案例包括:GCC交播,Emacs等。
AGPL
AGPL是對GPL的補充践付,如果使用了AGPL代碼的軟件是一個網(wǎng)絡應用秦士,那么這個軟件的所有源碼和修改代碼也必須開源,除非購買了該AGPL代碼的商業(yè)授權永高。
使用AGPL許可證的應用案例包括:BerkeleyDB隧土,MongoDB (2018年10月前發(fā)布的版本),Wiki.js等命爬。
LGPL
和GPL相比次洼,LGPL限制更少,是一個主要為類庫使用設計的開源協(xié)議遇骑,需要遵守以下規(guī)則:
- 如果軟件通過動態(tài)鏈接的方式使用LGPL類庫,則該軟件不需要開源揖曾。
- 如果軟件通過靜態(tài)鏈接的方式使用LGPL類庫落萎,則軟件作者必須提供程序的二進制目標文件(不需要提供源代碼),以便用戶有機會更新LGPL類庫并重新鏈接到該程序炭剪。
- 如果修改了LGPL的源碼或者衍生了新的代碼练链,則所有修改后及衍生的代碼也必須遵循LGPL許可證。
使用LGPL許可證的應用案例包括:7-Zip奴拦,GLib媒鼓,uClibc等。
MPL (Mozilla Public License)
MPL License由Mozilla基金會開發(fā)并維護错妖,介于BSD(衍生代碼可以閉源)和GPL(衍生代碼必須以GPL方式開源)之間绿鸣,最新發(fā)布的2.0版以更簡潔和更好的兼容其他協(xié)議為目標,鼓勵企業(yè)和開源社區(qū)為開發(fā)核心軟件做更多貢獻暂氯。使用MPL源碼需要遵守以下規(guī)則:
- 如果修改了MPL的源碼或者衍生了新的代碼潮模,并且以源代碼方式發(fā)布的文件,則所有修改后及衍生的代碼也必須遵循MPL許可證痴施。
- 如果用戶自有的源碼通過專用接口訪問MPL的源碼及類庫擎厢,則包含專用接口的代碼必須遵循MPL許可證,用戶自有源碼不必遵循MPL許可證辣吃。
- 用戶獲得MPL代碼中的專利許可动遭,但是不能使用其原始商標。
使用MPL許可證的應用案例包括:Mozilla Firefox, Mozilla Thunderbird, Apache Flex, LibreOffice等神得。
EPL (Eclipse Public License)
EPL License由Eclipse基金會開發(fā)并維護厘惦,在CPL基礎上刪除了專利相關訴訟的限制條款。EPL比GPL許可證更為寬松循头,并且與GPL并不兼容绵估。使用EPL源碼需要遵守以下規(guī)則:
- 如果修改了EPL的源碼或者衍生了新的代碼炎疆,并且以源代碼方式分發(fā),則所有修改后及衍生的代碼也必須遵循EPL許可證国裳。
- 如果軟件以二進制目標文件的形式分發(fā)形入,則需要聲明可以根據(jù)請求向其他用戶提供源代碼。
- 用戶獲得EPL代碼中的專利許可缝左。
使用EPL許可證的應用主要為Eclipse基金會名下的軟件亿遂,如著名的集成開發(fā)工具 - Eclipse。
應用實例
MariaDB
MariaDB是目前最受關注的MySQL數(shù)據(jù)庫衍生版渺杉,由開源社區(qū)開發(fā)和維護蛇数,誕生于Oracle收購MySQL后,目標是成為MySQL的替代品是越。
MariaDB的服務端使用的是GPL v2許可證耳舅,如果軟件只是內(nèi)部使用,并且沒有被包含在對外發(fā)布的產(chǎn)品中倚评,這種情況不被視為分發(fā)浦徊,可以自由使用;如果軟件用于對外發(fā)布天梧,使用了服務端的GPL代碼或者通過鏈接的方式使用了客戶端的GPL動態(tài)庫盔性,或者軟件與MariaDB數(shù)據(jù)庫強綁定,即在沒有安裝MariaDB數(shù)據(jù)庫的情況下呢岗,軟件無法運行或者只能使用非常少的功能冕香,該軟件也必須遵循GPL許可協(xié)議;但是如果該軟件通過第三方獨立框架訪問數(shù)據(jù)庫后豫,
MariaDB的C/JAVA/ODBC的客戶端動態(tài)庫使用了LGPL許可證悉尾,軟件也只需遵循LGPL協(xié)議,可以自由使用這些動態(tài)庫硬贯,不存在必須開源的問題焕襟。
如果軟件通過調(diào)用非GPL的連接器與MariaDB數(shù)據(jù)庫進行通信,例如:mysqlnd for PHP, ruby-mysql等饭豹,軟件只需要遵循該連接器所使用的許可證鸵赖。如果軟件通過第三方獨立的框架訪問數(shù)據(jù)庫,即使框架中使用了包含GPL許可證的模塊拄衰,例如:ODBC, JDBC, Perl它褪,PHP PDO等,軟件本身并不受其影響翘悉,不需要遵循GPL許可證茫打。如果發(fā)布的軟件除了可以訪問MariaDB數(shù)據(jù)庫之外,還可以訪問其他數(shù)據(jù)庫,即MariaDB在軟件中不屬于必須項老赤,在這種情況下該軟件可以和MariaDB一起自由發(fā)布轮洋,同樣不需要遵循GPL許可證。
如果軟件中必須使用數(shù)據(jù)庫服務端的相關代碼抬旺,又不希望自己的商業(yè)代碼遵循GPL許可證弊予,可以考慮以下三種方案:
- 使用類似MIT/BSD許可證的PostGreSQL作為替代產(chǎn)品。
- 更換為不使用SQL作為查詢語言的NoSQL非關系數(shù)據(jù)庫方案开财,例如:Cassandra (Apache 2.0), Redis (BSD-3-Clause), 或者 CouchDB (Apache 2.0)等汉柒。
- 付費購買帶有商業(yè)許可證的軟件,如MySQL, MongoDB等责鳍。
Linux Kernel
Linux內(nèi)核以GPL v2許可證發(fā)行碾褂,所以任何Linux內(nèi)核的衍生產(chǎn)品也必須遵循GPL許可證進行發(fā)布。如下圖所示的應用實例历葛,我們列出其中違反GPL許可證的使用方法(紅線所示)正塌。
- 應用程序通過靜態(tài)或動態(tài)鏈接的方式使用GPL類庫,會導致整個應用也必須以GPL許可證方式發(fā)布恤溶。規(guī)避方法是主程序通過LPC或者RPC間接調(diào)用GPL庫里的接口传货,或者改用動態(tài)鏈接LGPL類庫的方式。
- 應用程序通過非標準接口直接訪問Linux內(nèi)核的行為宏娄,會導致整個應用也必須以GPL許可證方式發(fā)布。規(guī)避方法是通過Linux 內(nèi)核提供的標準接口函數(shù)訪問Linux內(nèi)核逮壁,用戶空間的程序及類庫的普通系統(tǒng)調(diào)用不被視為Linux內(nèi)核的衍生產(chǎn)品孵坚,應用程序不需要遵循GPL許可證。
- 可加載內(nèi)核模塊(LKM)是用戶編寫的軟件窥淆,它與Linux內(nèi)核緊密綁定卖宠,運行在內(nèi)核地址空間中,Linux內(nèi)核開發(fā)社區(qū)認為LKM程序應該遵循GPL許可證忧饭。但是不少硬件廠商出于保護商業(yè)機密及知識產(chǎn)權的角度出發(fā)扛伍,在這一點與Linux內(nèi)核開發(fā)社區(qū)一直存在爭議,硬件廠商一般都會以二進制目標文件的方式單獨發(fā)布硬件驅動試圖規(guī)避GPL風險词裤,但是始終存在潛在的法律風險以及開源帶來的的商業(yè)影響刺洒,降低風險的方法就是同樣以GPL或者其他與GPL兼容的許可證發(fā)布LKM程序,并且不要把那些不希望開源的的私有代碼直接鏈接到LKM程序吼砂。
小結
由于GPL嚴格要求使用了GPL代碼或類庫的軟件產(chǎn)品必須使用GPL協(xié)議逆航,所以商業(yè)軟件最好不要使用GPL許可證的產(chǎn)品。開源許可證既保護代碼作者渔肩,對他人使用代碼產(chǎn)生的風險免責因俐;同時也保護代碼使用者,了解使用開源代碼的權利及必須履行的義務,規(guī)避將來可能的法律風險抹剩。