開源License介紹
通俗來講,開源許可證就是一種允許軟件使用者在一定條件內(nèi)按照需要自由使用和修改軟件及其源代碼的的法律條款。借此條款,軟件作者可以將這些權利許可給使用者,并告知使用限制。這些許可條款可以由個人、商業(yè)公司或非贏利組織起草。
概述
從整體上看,開源許可證大致分為寬松式(Permissive)許可證和著作權(copyleft)許可證兩類。兩者的差別主要在于寬松度以及使用開源軟件組件相關的要求和許可權限的多少。
比如說Copyleft類型的license,擁有該類型license的開源組件可以免費使用,但是一旦代碼中使用了這類組件,在將該代碼分發(fā)給其他人時,就必須開放你的源代碼。GPL許可證族就是這類許可證的代表。
與之相對的是寬松式許可證,它保證了使用、修改和重新分發(fā)的自由,幾乎沒有任何限制條件,如MIT。
除去這兩大類別的差異,每一類下許可證和許可證族也會因為一些附加參數(shù)而產(chǎn)生具體差異。每個開源許可證都有自己獨特的限制、條件和權限。
Copyleft許可證
非贏利性許可證中(名稱取與copyright相反之意),比較有代表性的是Eclipse開源許可證(EPL)和GNU GPL開源許可證。GNU GPL許可證族有強制性的Copyleft條款,即無論用戶代碼中包含多少GPL代碼,在分發(fā)其軟件時都要公開完整源代碼。
而EPL則是一種較弱的Copyleft許可證,它不要求用戶共享其整個軟件項目,而只需要在以源代碼形式分發(fā)時開源任何包含EPL組件的源碼。
隨著開源的使用愈發(fā)普遍,擁有Copyleft許可證的開源組件在商業(yè)組織中的流行度也越來越低。
Permissive許可證
寬松式許可證中,比較有名的有MIT,BSD和Apache 2.0。其中,MIT算是最寬松的許可證,幾乎沒有任何使用限制。
而BSD也是一種高度寬松的許可證,允許用戶以任何形式修改和重新分發(fā)使用了BSD許可證的軟件。
早期版本的Apache許可證與BSD許可證類似,但Apache 2.0增加了一些關鍵的差異,使得這兩種許可證區(qū)別開來。
主流license
在開源許可證中,最常被授予權限的行為涉及商業(yè)使用、分發(fā)、修改和私人使用。
注意,如果軟件只在個人、團隊、甚至是公司內(nèi)部使用,這么這些軟件源碼應當適用于私人使用許可,不屬于分發(fā)的情況。
主流的開源license按寬松度從高到低介紹如下:
名稱 | 描述 | 限制 |
---|---|---|
MIT | MIT是麻省理工學院的簡寫,也出自于此,又稱為X License或X11 License。用戶差不多可以隨心所欲地使用遵循該許可證的軟件 | 幾乎沒有任何限制,只要不修改原許可協(xié)議即可 |
BSD | 由加州大學伯克利分校發(fā)布。該許可一共有5個變種,分別是BSD 4-Clause “Original” or “Old” License、BSD 3-Clause “New” or “Revised” License、BSD 3-Clause Clear License、BSD 2-Clause “Simplified” License和BSD Zero Clause License。用戶可以使用、修改和重新發(fā)布遵循該許可的軟件,并可以將該軟件作為商業(yè)軟件發(fā)布和銷售 | 不能修改原BSD許可協(xié)議; 如果再發(fā)布的只是二進制類庫/軟件,需要在文檔和版權聲明中包含原來代碼中的BSD協(xié)議;不允許以原始開源軟件的名稱、作者名或者機構名來進行市場推廣 |
Apache | 該許可和BSD類似,同樣適用于商業(yè)軟件,鼓勵代碼共享和尊重原作者的著作權。包括Apache License 1.0, Apache License 1.1 和Apache License 2.0版本 | 如果修改了源代碼,需要在文檔中進行聲明;不能修改原許可協(xié)議和其他聲明;如果再發(fā)布的軟件中有聲明文件,則需在此文件中標注Apache許可協(xié)議及其他 |
MPL | 該許可為Mozilla Public License推出,允許復制,分發(fā)和修改源代碼。與GPL不同的是,MPL不具有傳染性 | 如果對源代碼進行修改,則修改后的代碼仍然要使用MPL協(xié)議,且代碼版權歸原作者所有 |
LGPL | GNU Lesser General Public License的縮寫。與GPL類似,但許可條款更為寬松,分為LGPLv1, LGPLv2和LGPLv3。LGPL允許在非開源軟件中使用或鏈接LGPL許可證的代碼庫,而不要求整個程序必須遵循LGPL許可。 | 如果對使用了LGPL的源代碼進行修改,則修改后的代碼必須使用LGPL協(xié)議;適合作為第三方類庫使用 |
GPL | GPL協(xié)議又分為GPLv1,GPLv2,GPLv3三個版本。GPL協(xié)議來源于自由軟件聯(lián)盟GNU,側重于代碼和衍生代碼的開源與免費使用。GPL是傳染性協(xié)議,只要軟件中包含了遵循GPL協(xié)議的產(chǎn)品或代碼,該軟件就必須也遵循GPL許可 | 軟件中包含遵循GPL的代碼,則該軟件必須也使用GPL協(xié)議,在分發(fā)時也需要開源 |
總結一下,MIT是最自由的,幾乎沒有任何限制,甚至可以以原作者名義來進行商業(yè)推廣。
BSD和Apache許可也很自由,可以修改源碼之后閉源。但不允許用原作者名義進行商業(yè)推廣,保護原作者版權。
GPL則是最嚴格的許可,具有強烈的傳染性,任何軟件只要使用了擁有GPL許可的代碼,則軟件本身也需要使用GPL許可。
License檢測
在Maven管理的項目中,一般使用license-maven-plugin插件來對第三方庫的License進行檢測。
該插件在maven default生命周期的主要目標描述如下:
- license:add-third-party:針對單個項目生成一個包含所有第三方依賴包的license的文件。
- license: aggregate-add-third-party: 對多模塊項目生成一個包含所有第三方依賴包的license的文件。
- license: download-license: 下載每個依賴關聯(lián)的license文件
- license: aggregate-download-licenses: 下載多模塊項目每個依賴關聯(lián)的license文件
- license: license-list: 列出所有的liencese文件
除此之外,還有一些其他如check-file-header, update-file-header等目標,具體可見參考文檔[2]。
該插件在maven的site生命周期的report目標如下:
- license: third-party-report: 生成項目的第三方包報告
- license: aggregate-third-party-report: 生成聚合的第三方包報告,其中包括所有子模塊的依賴
目標
如果某些依賴沒有l(wèi)icense聲明,你可以通過自定義方式生成license元數(shù)據(jù),這就是所謂的missing文件。
該文件用于將maven坐標規(guī)范映射到許可證描述,如下所示:
# <groupId>--<artifactId>--<version> = <license name>
org.codehaus.mojo.license.test--test-add-third-party-global-db-misc-dep--1=The Apache Software License, Version 2.0
add-third-party
該目標用于生成第三方license文件。
本目標默認綁定到maven的default生命周期的generate-resources
階段(在compile
之前)。
該目標有兩個必要參數(shù)以及其他可選參數(shù)。
outputDirectory
必要參數(shù),生成license文件的輸出路徑,默認值為${project.build.directory}/generated-sources/license
,用戶屬性(命令行使用)為license.outputDirectory
。
thirdPartyFilename
必要參數(shù),生成license文件的文件名,默認值為THIRD-PARTY.txt,用戶屬性為license.thirdPartyFilename
。
includedLicenses
可選參數(shù),指定包含在內(nèi)的licenses。
如果在指定了該參數(shù)和failOnBlacklist
情況下,有l(wèi)icense不在白名單內(nèi),則本次構建會失敗。
從1.4版本之后,有三種方式指定此參數(shù),如
<includedLicenses>licenseA|licenseB</includedLicenses>
還可以在includedLicenses配置下增加多個includedLicense單項配置。
自1.15版本之后,可以通過一個包含license白名單的url指定:<includedLicenses>http://my.license.host.com/my-whitelist</includedLicenses>
。
file://
開頭的地址也是url,因此白名單url可以指定本地文件。
excludedLicenses
可選參數(shù),黑名單license,可與failOnBlacklist
配合使用。配置方式與白名單license參數(shù)一樣。
licenseMergesUrl
合并之后的licenses文件url。
每一個license都有不同的寫法,比如ASF 2.0或Apache v2,同一個license的不同寫法都配置到同一行,用|
來分隔,其中第一個寫法為最終版本,并最終生成到thirdPartyFilename
文件中。
missingFile
對于沒有l(wèi)icense信息的第三方依賴,通過此文件中的設置將license信息添加到最終生成的license文件中,格式由fileTemplate
指定。
fileTemplate
生成最終license文件的模板。該模板文件使用了freemarker。既可以指定單個文件,也可以指定單個資源。
默認值為/org/codehaus/mojo/license/third-party-file.ftl
。
excludedGroups
一個正則表達式(非通配符模式)。所有groupId與該表達式匹配的組件將被排除在license檢測之外。
正則表達式可以是部分匹配的,如^org\.
。默認情況下,被排除的組件的間接依賴不會被排除。如果想將其間接依賴也排除掉,可參考excludeTransitiveDependencies
參數(shù)。
includedArtifacts
一個正則表達式(非通配符模式)。只有artifactId與該表達式匹配的組件才在license檢測范圍之內(nèi)。
默認情況下,對于匹配的組件,其間接依賴也包含在檢測范圍以內(nèi)。如果想禁用此機制,可以參考includeTransitiveDependencies
參數(shù)。
failIfWarning
如果檢測到某個依賴沒有l(wèi)icense,則本次構建失敗。默認值為false
。
從1.14版本之后該參數(shù)廢棄,建議使用failOnMissing
或failOnBlacklist
。
failOnBlacklist
當某個組件的license不在白名單或者在黑名單中,本次構建失敗。
failOnMissing
當某個組件的license缺失時,本次構建失敗。
示例
在Springboot模版生成的代碼中添加上license檢測插件,配置示例如下:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>license-maven-plugin</artifactId>
<executions>
<execution>
<id>add-third-party</id>
<goals>
<goal>add-third-party</goal>
</goals>
<phase>process-resources</phase>
</execution>
</executions>
<configuration>
<includedLicenses>file:${project.basedir}/build/license/compliance-license.txt</includedLicenses>
<licenseMergesUrl>file:${project.basedir}/build/license/merge-license.txt</licenseMergesUrl>
<missingFile>${project.basedir}/build/license/third-party-missing.properties</missingFile>
<useMissingFile>true</useMissingFile>
<fileTemplate>${project.basedir}/build/license/license-as-csv.ftl</fileTemplate>
<outputDirectory>${project.basedir}/target/generated-sources/license</outputDirectory>
<thirdPartyFilename>license_${project.artifactId}.csv</thirdPartyFilename>
<failOnBlacklist>true</failOnBlacklist>
<failOnMissing>true</failOnMissing>
</configuration>
</plugin>
并添加兩個第三方依賴:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>commons-primitives</groupId>
<artifactId>commons-primitives</artifactId>
<version>1.0</version>
</dependency>
在根目錄下創(chuàng)建對應的文件目錄和文件,每個文件均為空。由于add-third-party目標綁定在process-resources
階段,因此只要執(zhí)行mvn clean compile
命令即可自動執(zhí)行該插件目標??刂婆_輸出如下:
[INFO] Missing file /Users/howe/workSpace/PremissDemo/build/license/third-party-missing.properties is up-to-date.
[WARNING] There is 1 dependency with no license :
[WARNING] - commons-primitives--commons-primitives--1.0
[INFO] Writing third-party file to /Users/howe/workSpace/PremissDemo/target/generated-sources/license/license_PremissDemo.csv
[INFO] Regenerate missing license file /Users/howe/workSpace/PremissDemo/build/license/third-party-missing.properties
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
由于commons-primitives
庫缺少license,而插件配置了failOnMissing
參數(shù),因此本次構建失敗。
查看missing文件如下:
# Generated by org.codehaus.mojo.license.AddThirdPartyMojo
#-------------------------------------------------------------------------------
# Already used licenses in project :
# - Apache License 2.0
# - Apache License, Version 2.0
# - BSD License 3
# - BSD-3-Clause
# - EDL 1.0
# - EPL 2.0
# - Eclipse Distribution License - v 1.0
# - Eclipse Public License - v 1.0
# - Eclipse Public License v2.0
# - GNU Lesser General Public License
# - GPL2 w/ CPE
# - MIT License
# - The Apache License, Version 2.0
# - The Apache Software License, Version 2.0
# - The MIT License
#-------------------------------------------------------------------------------
# Please fill the missing licenses for dependencies :
#
#
#Wed Nov 29 14:22:15 CST 2023
commons-primitives--commons-primitives--1.0=
設置missing文件
指定該組件的license如下:
commons-primitives--commons-primitives--1.0=Apache License 2.0
再次執(zhí)行mvn clean compile
,構建成功。本來應該將生成的license信息寫入目標文件,但由于模版文件為空,因此實際生成的目標文件也為空。
設置模板文件
下面使用模板[3]如下:
<#-- To render the third-party file.
URL: https://gist.github.com/matthesrieke/8819894
Available context :
- dependencyMap a collection of Map.Entry with
key are dependencies (as a MavenProject) (from the maven project)
values are licenses of each dependency (array of string)
- licenseMap a collection of Map.Entry with
key are licenses of each dependency (array of string)
values are all dependencies using this license
-->
<#function licenseFormat licenses>
<#assign result><#list licenses as license>[${license}]<#if (license_has_next)> - </#if></#list></#assign>
<#assign result = "\"" + result + "\","/>
<#return result>
</#function>
<#function artifactFormat p>
<#if p.name?index_of('Unnamed') > -1>
<#return "\"" + p.artifactId + "\",\"" + p.groupId + ":" + p.artifactId + ":" + p.version + "\",\"" + (p.url!"no url defined") + "\"">
<#else>
<#return "\"" + p.name + "\",\"" + p.groupId + ":" + p.artifactId + ":" + p.version + "\",\"" + (p.url!"no url defined") + "\"">
</#if>
</#function>
<#if dependencyMap?size == 0>
The project has no dependencies.
<#else>
"License","Name","Artifact","URL"
<#list dependencyMap as e>
<#assign project = e.getKey()/>
<#assign licenses = e.getValue()/>
${licenseFormat(licenses)}${artifactFormat(project)}
</#list>
</#if>
再次執(zhí)行maven命令,在target/generated-sources/license
目錄下就可以看到已經(jīng)生成license信息了:
其中有一條:
"[Apache License 2.0]","commons-primitives","commons-primitives:commons-primitives:1.0","no url defined"
這是由于在missing文件中指定了commons-primitives
插件使用Apache License 2.0
,所以才生成如此。
注意到,由于license白名單為空,也沒有配置黑名單,因此failOnBlacklist
參數(shù)實際上就沒有什么意義了。每次執(zhí)行都會成功。
設置白名單
下面設置license白名單:
Apache License 2.0
MIT License
BSD License 3
再次執(zhí)行maven命令,輸出如下:
[INFO] --- license-maven-plugin:2.3.0:add-third-party (add-third-party) @ PremissDemo ---
[INFO] Load missingFile /Users/howe/workSpace/PremissDemo/build/license/third-party-missing.properties
[INFO] Missing file /Users/howe/workSpace/PremissDemo/build/license/third-party-missing.properties is up-to-date.
[INFO] Included licenses (whitelist): [Apache License 2.0, MIT License, BSD License 3]
[WARNING] There are 12 forbidden licenses used:
[WARNING] License: 'EDL 1.0' used by 1 dependencies:
-Jakarta Activation API (jakarta.activation:jakarta.activation-api:2.1.2 - https://github.com/jakartaee/jaf-api)
[WARNING] License: 'The Apache License, Version 2.0' used by 2 dependencies:
-org.apiguardian:apiguardian-api (org.apiguardian:apiguardian-api:1.1.2 - https://github.com/apiguardian-team/apiguardian)
-org.opentest4j:opentest4j (org.opentest4j:opentest4j:1.2.0 - https://github.com/ota4j-team/opentest4j)
[WARNING] License: 'BSD-3-Clause' used by 1 dependencies:
...
有很多l(xiāng)icense不在白名單中,而failOnBlacklist
參數(shù)為true的情況下,此種情況構建會失敗,也不會生成最終的license信息。
同時注意到,我們已經(jīng)將BSD License 3
添加到白名單了,但仍然提示BSD-3-Clause
非法。這就是上文說的,同一個license可以有不同的叫法。為了解決這種情況,我們就需要在merge文件中設置license別名了。
合并license
設置license別名,如下所示:
BSD License 3 | BSD-3-Clause
MIT License | The MIT License
Apache License 2 | Apache License 2.0 | Apache License, Version 2.0 | The Apache License, Version 2.0 | The Apache Software License, Version 2.0
EPL 1 | Eclipse Public License - v 1.0
EPL 2 | Eclipse Public License v2.0 | EPL 2.0
EDL 1 | Eclipse Distribution License - v 1.0 | EDL 1.0
LGPL | GNU Lesser General Public License
如此配置后,每一行都表示是同一個license,且使用第一個名稱。如果第一個名稱不在白名單內(nèi),同樣會構建失敗。因此需要將白名單補充完整:
Apache License 2
MIT License
BSD License 3
EPL 1
EPL 2
EDL 1
再次執(zhí)行maven命令,構建成功。
執(zhí)行mvn clean compile license:third-party-report
命令,還可以看到生成的license報告了。
可以從報告中看到,commons-primitives組件的license信息來自于missingFile文件,其他所有組件的license信息均來自于各自的pom文件。文章來源:http://www.zghlxwxcb.cn/news/detail-770276.html
參考資料
[1].https://cloud.tencent.com/developer/article/2141158
[2].https://www.mojohaus.org/license-maven-plugin/
[3].https://gist.github.com/rogelio-blanco/bd2e2a544f7ff1f0263b2bdefd86b883文章來源地址http://www.zghlxwxcb.cn/news/detail-770276.html
到了這里,關于開源軟件license介紹與檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!