架構(gòu)師必備:使用開(kāi)源協(xié)議的注意事項(xiàng)與實(shí)踐指南

大家好,今天小米要和大家分享的是關(guān)于項(xiàng)目上源碼開(kāi)源協(xié)議的問(wèn)題。最近在我們的一個(gè)項(xiàng)目中,客戶要求對(duì)我們的源碼版權(quán)進(jìn)行掃描,讓我感到有些困惑。作為一個(gè)項(xiàng)目開(kāi)發(fā)者,這是我第一次遇到開(kāi)發(fā)的代碼需要考慮引用三方類庫(kù)是否支持商業(yè)使用的問(wèn)題。
常見(jiàn)的版權(quán)協(xié)議
在我們的電商源碼中,我們使用了以下協(xié)議:
Apache License 2.0:Apache License是對(duì)商業(yè)應(yīng)用非常友好的許可協(xié)議。使用者可以根據(jù)需要修改代碼,并將其作為開(kāi)源或商業(yè)產(chǎn)品發(fā)布和銷售。
BSD開(kāi)源協(xié)議(Berkerley Software Distribution):商業(yè)軟件可以使用,并可以修改使用BSD協(xié)議的代碼。
LGPL (GNU Library or “Lesser” General Public License):商業(yè)軟件可以使用,但不能修改LGPL協(xié)議的代碼。
MIT (MIT license):商業(yè)軟件可以使用,并可以修改MIT協(xié)議的代碼,甚至可以出售MIT協(xié)議的代碼。
MPL (Mozilla Public License 1.1):商業(yè)軟件可以使用,并可以修改MPL協(xié)議的代碼,但修改后的代碼版權(quán)歸軟件的發(fā)起者所有。
CDDL (Common Development and Distribution License):商業(yè)軟件可以使用,并可以修改CDDL協(xié)議的代碼。
EPL (Eclipse Public License 1.0):商業(yè)軟件可以使用,并可以修改EPL協(xié)議的代碼,但使用者需要承擔(dān)代碼產(chǎn)生的侵權(quán)責(zé)任。
CC0(Public Domain):“CC0”的全稱為“Creative Commons Zero”,是一種開(kāi)放授權(quán)協(xié)議,旨在允許原作者放棄對(duì)其作品的所有版權(quán)和鄰接權(quán)利,使之成為公有領(lǐng)域的一部分。可以自由地使用、共享和修改該作品,甚至可以用于商業(yè)用途,無(wú)需經(jīng)過(guò)原作者的許可或支付費(fèi)用。
GPL (GNU General Public License):GNU GPL是最廣泛應(yīng)用的開(kāi)源協(xié)議之一,由自由軟件基金會(huì)(FSF)制定。該協(xié)議規(guī)定了軟件的使用、復(fù)制、修改、分發(fā)等方面的規(guī)則,要求將使用、修改后的軟件同樣以GPL協(xié)議開(kāi)源,并保留原作者的版權(quán)信息。因此,使用GNU GPL協(xié)議的軟件必須也是開(kāi)源的,并且不能將其用于商業(yè)用途。GPL家族下的其他協(xié)議,如AGPL等同樣不能商用。
除此之外,還有一些類庫(kù)遵守MIT協(xié)議、Bouncy Castle等。
綜上所述,MIT License、Apache License和BSD License都是可以用于商業(yè)用途的開(kāi)源協(xié)議,而GNU、GPL和其他未知協(xié)議則不允許將其用于商業(yè)用途。
經(jīng)過(guò)使用"license-maven-plugin"進(jìn)行掃描,我們發(fā)現(xiàn)至少有13個(gè)服務(wù)含有不可商用協(xié)議,大致內(nèi)容如下所示。

對(duì)于這些問(wèn)題,我們采取了以下措施來(lái)進(jìn)行處理。
Maven Dependency Helper
首先,根據(jù)掃描結(jié)果中的版權(quán)掃描鏈接,我們針對(duì)不可商用協(xié)議進(jìn)行了修改。然后,在IDEA中的插件中找到一個(gè)叫做"Maven Dependency Helper"的工具,將其安裝到本地,并點(diǎn)擊需要修改的微服務(wù)的pom文件。在pom文件的左下角,我們可以看到一個(gè)名為"Dependency Analyzer"的按鈕。

點(diǎn)擊該按鈕后,會(huì)展示所有的三方類庫(kù)依賴,以樹(shù)狀圖的形式呈現(xiàn)。這樣我們可以更好地找到非商用的類庫(kù)。
接下來(lái),我們選擇"All Dependencies as Tree",這樣所有的依賴關(guān)系會(huì)以樹(shù)狀圖的形式展示,方便我們找到有問(wèn)題的類庫(kù)。我們?cè)谳斎肟蛑休斎胗袉?wèn)題的類庫(kù)名稱,并點(diǎn)擊右側(cè)的"Filter"按鈕,這樣就可以找到有問(wèn)題的類庫(kù)。

未知協(xié)議的處理建議
針對(duì)未知協(xié)議的類庫(kù),我們進(jìn)行如下處理:
對(duì)于沒(méi)有掃描出具體協(xié)議的類庫(kù),我們首先查閱類庫(kù)包里的pom文件或者LICENSE文件,看是否有明確的開(kāi)源協(xié)議。

如果無(wú)法通過(guò)pom文件獲得信息,我們會(huì)在GitHub上查看是否有標(biāo)記開(kāi)源協(xié)議的信息。

明確非商用協(xié)議的處理建議
針對(duì)已經(jīng)明確是非商用協(xié)議的類庫(kù),我們進(jìn)行如下處理:
如果類庫(kù)使用了非商用協(xié)議,我們首先確定該類庫(kù)是否被項(xiàng)目所使用。如果沒(méi)有被使用,我們可以將其排除。
如果該類庫(kù)被項(xiàng)目所依賴,我們需要與項(xiàng)目經(jīng)理、產(chǎn)品經(jīng)理進(jìn)行溝通,確認(rèn)該業(yè)務(wù)是否為過(guò)時(shí)業(yè)務(wù),如果是,我們可以將其刪除。
如果是正在使用的業(yè)務(wù),我們需要使用已知開(kāi)源的三方類庫(kù)對(duì)原來(lái)的業(yè)務(wù)代碼進(jìn)行相應(yīng)的重寫(xiě)。
通過(guò)以上處理,我們能夠確保項(xiàng)目中的源碼符合開(kāi)源協(xié)議的要求,保護(hù)了版權(quán)和商業(yè)使用的合規(guī)性。同時(shí),我們也要時(shí)刻關(guān)注開(kāi)源協(xié)議的更新和變化,以確保我們的項(xiàng)目源碼始終與開(kāi)源協(xié)議保持一致。
END
希望以上內(nèi)容能夠?qū)Υ蠹依斫忭?xiàng)目上源碼開(kāi)源協(xié)議的問(wèn)題有所幫助。如果對(duì)開(kāi)源協(xié)議還有疑問(wèn)或者有其他相關(guān)問(wèn)題,歡迎在評(píng)論區(qū)留言,小米會(huì)盡力為大家解答。感謝大家的閱讀與支持!
如有疑問(wèn)或者更多的技術(shù)分享,歡迎關(guān)注我的微信公眾號(hào)“知其然亦知其所以然”!
