# 第三方版权说明
本文档针对开发过程中涉及的第三方源码或二进制包的版权作相关说明。
说明: Sermant目前使用协议为Apache-2.0 License (opens new window),该License有如下几点要求:
- 需要给代码的用户一份Apache Licence。
- 如果你修改了代码,需要在被修改的文件中说明。
- 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
- 在发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
# 源码引用
如果在代码中,存在以下情况,视为对第三方源码的引用:
- 整体拷贝:直接拷贝第三方源码中的文件,在其基础上进行修改。
- 局部拷贝:拷贝第三方源码中部分方法或内部类,将其用于自研代码中。
- 设计参考:开发者在进行架构设计时,若参考第三方的架构,且两种架构中存在定位相同的内容,也视为 引用。
以上三种情况中,需要开发者对涉及的文件做如下操作:
- 在
LICENSE文件中添加对第三方源码的拷贝说明,形如:其中:The following files contain a portion of ${THIRD PARTY PROJECT NAME} project. ${RELATED FILE A} in this product is copied from ${THIRD PARTY FILE A} of ${THIRD PARTY PROJECT NAME} project. ${RELATED FILE B} in this product is copied from ${THIRD PARTY FILE B} of ${THIRD PARTY PROJECT NAME} project. ... ${THIRD PARTY PROJECT NAME} project is published at ${THIRD PARTY PROJECT CODEBASES URL} and its license is ${THIRD PARTY PROJECT LICENSE NAME}.THIRD PARTY PROJECT NAME表示第三方工程的名称。RELATED FILE为本项目的涉事文件:为类时,键入全限定名路径;否则,键入项目相对路径。THIRD PARTY FILE表示第三方的被拷贝文件:为类时,键入全限定名路径;否则,键入项目相对路径;如果第三方项目是单模块项目,也可键入source目录相对路径。THIRD PARTY PROJECT CODEBASES URL表示第三方工程源码仓的地址;如果找不到源码仓地址,可以改为官方网站地址或源码下载地址,总之原则就是要做到可溯源。THIRD PARTY PROJECT LICENSE NAME表示第三方工程的LICENSE名称,通常可以参考其pom文件中的licenses标签,如果存在多个LICENSE,则改为复数形式:... and its licenses are ${LICENSE A}, ${LICENSE B}, ..., and ${LICENSE C}.- 如果已经存在目标第三方工程的条目,则掐头去尾将中间的拷贝信息填入即可。
- 在涉事文件中键入被拷贝文件的头信息(如果有),并添加拷贝源信息,形如:
Based on ${THIRD PARTY FILE} from the ${THIRD PARTY PROJECT NAME} project. - 如果第三方工程中含有
NOTICE文件,则将其追加到本工程的NOTICE文件结尾。如果已经包含,无需重复追加多次。
# 带依赖jar包
如果开发者:
- 没有修改
resources标签的内容 - 开发的模块中
sermant.basedir参数正确指向顶层目录 - 不打带依赖
jar包,或使用shade插件打带依赖jar包,且没有修改transformers标签
那么无需对输出的jar包作任何调整,否则请详细阅读下面的说明,并按实际情况处理。
在默认打包过程中,需要将本工程默认的LICENSE文件和NOTICE文件打入。这两个文件存放于sermant-package模块的resources/META-INF目录下,由resources标签特别地指向。
一般情况下,只要保证打包的模块(packaging标签的值不为pom)中sermant.basedir参数指向本工程的顶层目录,就会默认添加这两个文件,无需特别关心。
在打包流程中,使用shade插件、assembly插件或spring打包插件打带依赖jar包时,如果打入的第三方jar包中含有NOTICE文件,最好将他们与本工程默认的NOTICE文件合并。shade插件的ApacheNoticeResourceTransformer正好可以做到这一点。这一点在顶层工程的pom文件中有配置,除非有修改Transformer的需要,否则不建议覆盖顶层工程的shade插件设置。
注意:本节所提到的默认的LICENSE文件和NOTICE文件,指的是仅包含本工程相关信息的文件。在项目顶层目录中存放的LICENSE文件和NOTICE文件,系整理过源码拷贝信息后的文件,包含本工程相关信息和被拷贝的第三方工程信息。
# RELEASE产品包
RELEASE产品包中需要将工程源码的LICENSE文件和NOTICE文件带上,前者还需要添加RELEASE产品包中所有涉及的第三方jar包的LICENSE信息。RELEASE产品包还需要将与本工程LICENSE不同的第三方LICENSE存放于licenses目录中带上,该目录存放于sermant-package模块的resources目录中。
综上,RELEASE产品包内部结构形如:
agent目录: 核心增强逻辑server目录: 增强逻辑配套的服务端licenses目录: 与本工程LICENSE不同的第三方开源依赖项目LICENSE存放目录LICENSE文件: 本工程LICENSE文件,附加拷贝第三方开源源码的LICENSE声明,以及RELEASE产品包中涉及的所有第三方开源依赖项目jar包的LICENSE说明NOTICE文件: 本工程NOTICE文件,追加拷贝第三方开源源码的NOTICE文件。
本工程通过以下方式生成RELEASE产品包的LICENSE文件、NOTICE文件和licenses目录:
- 通过
license-maven-plugin插件生成项目中所有涉及的第三方jar包的LICENSE信息:生成的文件mvn license:aggregate-add-third-partyLICENSE-binary-suffix.txt存放于sermant-package模块的resources目录。该过程初次执行时间较久,请耐心等待。 - 工程各组件打包,输出到临时目录下。
- 在
sermant-package模块打包时:- 将工程源码的
LICENSE文件、NOTICE文件和licenses目录拷贝到临时目录中。 - 调用脚本将
LICENSE-binary-suffix.txt文件追加到临时目录的LICENSE文件。 - 将临时目录压缩为
RELEASE产品包。
- 将工程源码的
综上,开发者可以通过以下命令编译并发布RELEASE产品包:
mvn license:aggregate-add-third-party clean package -Dmaven.test.skip
