作者丨云昭 昨天,火山引擎被曝不遵守Apache2。0许可证要求,其中的ApplicationPerformanceMonitoringDistributedTracing(应用性能监控全链路版)以非法方式重新发行了ApacheSkyWalking。 ApacheSkyWalking官网上声称: 火山引擎的团队更改了所有软包名称,删除了Apache软件基金会的抬头,在重新发行时没有保留Apache软件基金会和ApacheSkyWalking的LICENSE(许可证)和NOTICE(告知)文件。此外,在对方的网站上找不到任何声明他们在发行SkyWalking的内容。 起因 ApacheSkyWalking是一个分布式系统的开源APM,是Apache软件基金会的顶级项目。 1月28日,ApacheSkyWalking收到了一个提交者(匿名)的许可证违规报告。他们有一个云服务,叫做应用性能监控全链路版(ApplicationPerformanceMonitoringDistributedTracing)。在Java服务监控部分,匿名提交者提供了这个代理下载链接: https:datarangers。com。cnapminsightrepov2downloadjavaagentapminsightjavaagentlatest。tar。gz ApacheSkyWalking官方团队下载并在已经将其存档,已经确认这是一个SkyWalkingJavaagent的二次分发,并给出了三点证据,读者可以与官方的SkyWalking源代码(https:github。comapacheskywalkingjava)进行比较。细节 以下是官网披露的违反Apache2。0许可证的细节: 1、第一个也是最简单的部分是agent。config文件,该文件使用相同的配置键和相同的配置格式。 这是火山引擎的版本,可以对比SkyWalkingagent。config 2、在apmplusagent。jar即Volcengine的代理核心jar文件中,你可以轻松找到几个与SkyWalking的核心类一模一样的核心类。 ComponentsDefine类根本没有变化,就连组件ID和名称都一样 这是火山引擎的版本,SkyWalking的版本链接: https:github。comapacheskywalkingjavablob395ce4f86ae14cf24af489a6aa7e849b1d9a27edapmprotocolapmnetworksrcmainjavaorgapacheskywalkingapmnetworktracecomponentComponentsDefine。java。 3、代码名称、软件包名称和代码层次结构全部与SkyWalking6。x版本一模一样。 火山引擎版本的软件包层次结构 SkyWalking的版本详见: https:github。comapacheskywalkingjavatreev6。6。0apmsnifferapmagentcoresrcmainjavaorgapacheskywalkingapmagentcorecontext。Apache许可证 Apache许可证是著名的非盈利开源组织Apache采用的协议,Apache2。0许可证相对GPL已经非常宽松了。比如:商业软件可以任意的使用BSD,Apache2。0发布的软件代码不需要开放源代码,只需要提及代码的原出处就可以了。 协议中明确写出,只要遵守该许可的条款和条件的前提下,每位贡献者将被授予永久的、全球性的、非排他性的、免费的、免版税的、不可撤销的版权许可,以复制、准备衍生作品、公开展示、公开使用、再许可、分发本作品和其衍生作品(无论是以源码还是目标形式)。 也就是不仅可以用,还可以对基于ApacheLicenseVersion2。0的作品或衍生作品进行修改或增补,并应用到商业项目。但前提是满足以下几个条件:需要给代码的用户一份ApacheL如果你修改了代码,需要在被修改的文件中说明;在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明;如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有ApacheLicense。你可以在Notice中增加自己的许可,但不可以表现为对ApacheLicense构成更改。 也就是说,就是需要在相关产品的发行版本,Notice文件、源码或文档里,添加归属声明的可读拷贝,并给接收者提供开源项目中提供的ApacheLicenseVersion2。0许可证的拷贝,在分发的衍生作品的源代码中,必须保留本作品源码中的所有版权、专利、商标和归属声明。反思 所有的开源许可证都带有披露要求(noticerequirement),即要求软件的分发者必须向用户披露,软件里面有开源代码。如果一种开源许可证没有任何使用条件,连保留作者信息都不需要,那么就等同于放弃版权了。 其实遵守并不难。一般来说,你只要在软件里面提供完整的原始许可证文本,并且披露原始作者,就满足了披露要求。 开源协议在方便每个开发者贡献代码的同时,不但保护原始作者的身份,也是为了可以阻止其它人将某个产品据为己有。 目前,世界上流行的开源协议也不少,如何来选择也是开发者需要考虑的问题。关于常用的开源许可证,最流行的六种GPL、BSD、MIT、Mozilla、Apache和LGPL之中做选择,也很复杂。 乌克兰程序员PaulBagwell,画了一张分析图,这里附上一张中文版,希望能帮助大家搞清楚这六种许可证之间的最大区别。 总结 目前国际公认的开源许可证的共同特征是,都允许用户免费地使用、修改、共享源码,但是都有各自的使用条件。在如今一个大的开源开发背景下,开源软件衍生的商业产品越来越多,开发者在选择和使用开源代码时,一定要注意遵守开源协议。 火山引擎相关负责人表示,火山引擎接到社区反馈后,第一时间调查处理此事,正在相关产品文档和分发SDK上加入SkyWalking的版权声明,并联系开发者沟通道歉。 火山引擎会严格遵循开源社区规范,全面自查,避免此类问题再次发生。