Jar Licenses check

前言:

我们都知道目前我们使用的开源项目都有自己的开源许可协议,如果商用软件没有对自己使用的开源项目进行检测,有可能会带来不必要的麻烦,所以这里对jar进行许可协议的获取。

mvn项目:

如果是mvn项目,则很简单了,我们使用如下命令即可:

mvn project-info-reports:dependencies 生成对应Licenses
mvn dependency:tree  查看包结构

使用上述命令后会生成target\site目录,里面的dependencies.html为生成的文件,里面可以看到对应第三方项目的 Licenses :

这个就很简单了,但是一些比较老的项目并不是使用mvn,这样的情况下可以使用工具scancode-toolkit来扫描

scancode-toolkit:

首先是安装该工具,首先可以去官方地址下载:

https://github.com/nexB/scancode-toolkit?tab=readme-ov-file

下载对应的系统和python版本的到系统即可,或者直接使用pip安装:

pip install scancode

安装完成后可以使用如下命令对系统进行扫描:

scancode --license --ignore "*.class" --html test.html D:\test

该命令扫描license但是不对.class为后缀的文件进行扫描,将结果保存为html,扫描文件为D:\test文件,但是这样有个问题就是该命令只能扫描源代码或者解压后的jar文件,如果jar文件没有解压,则无法扫描出结果,这里使用如下代码对可能存在license的文件进行提取:

python 复制代码
    def GetJarLicenses(self, jar_file, output_dir):
        # jar_file = "D:\\test\\stax2-api-4.2.1.jar"
        # output_dir = "D:\\test\\stax2-api-4.2.1"
        try:
            with zipfile.ZipFile(jar_file, 'r') as jar:
                for file_info in jar.infolist():
                    # pom.xml
                    if file_info.filename.endswith(".xml"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
                    # LICENSE.txt NOTICE.txt
                    elif file_info.filename.endswith(".txt"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
                    # MANIFEST.MF
                    elif file_info.filename.endswith(".MF"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
                    # .tld
                    elif file_info.filename.endswith(".MF"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
                    elif file_info.filename.endswith("LICENSE"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
                    elif file_info.filename.endswith("NOTICE"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
                    elif file_info.filename.endswith("about.html"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
                    elif file_info.filename.endswith("DEPENDENCIES"):
                        file_info.filename = os.path.basename(file_info.filename)
                        jar.extract(file_info, output_dir)
        except Exception as e:
            print(e)

提取完对应的文件到指定文件后,即可进行扫描,使用如下命令:

python 复制代码
scancode --license --csv D:\test.csv D:\test\file

扫描完成为一个test.csv文件,可以使用如下代码进行读取过滤:

python 复制代码
    def ReadCsv(self, csvpath):
        with open(csvpath, encoding='utf-8') as f:
            reader = csv.reader(f)
            header = next(reader)
            print(header)
            for row in reader:
                if(len(row) != 0 and row[2] != ""):
                    if(row[2].find("GPL") != -1 or row[2].find("gpl") != -1):
                        self.JarLicenses.append([row[0],row[2]])

    # 写入接安插结果
    def WriteLicenses(self):
        try:
            jar_xlsx = xlwt.Workbook(encoding="utf-8", style_compression=0)
            sheet1 = jar_xlsx.add_sheet('OutPut', cell_overwrite_ok=True)
            sheet1.write(0, 0, 'JarName')
            sheet1.write(0, 1, 'JarLicenses')
            numrow = 1
            for i in range(0, len(self.JarLicenses)):
                sheet1.write(numrow, 0, self.JarLicenses[i][0])
                sheet1.write(numrow, 1, self.JarLicenses[i][1])
                numrow = numrow + 1

            file_name = time.strftime("%Y%m%d", time.localtime())
            jar_xlsx.save(self.xlsxsavedir + '\\' + file_name + '_JarLicenses.xls')
        except Exception as e:
            print(e)

主要扫描了包含GPL即GPL和LGPL都会被输出,参考标准:

输出结果人工排除下即可。

相关推荐
枫叶_v18 分钟前
【SpringBoot】20 同步调用、异步调用、异步回调
java·spring boot·后端
鸣弦artha24 分钟前
蓝桥杯——杨辉三角
java·算法·蓝桥杯·eclipse
大波V532 分钟前
设计模式-参考的雷丰阳老师直播课
java·开发语言·设计模式
计算机-秋大田38 分钟前
基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
java·spring boot·微信小程序·小程序·vue·课程设计
《源码好优多》1 小时前
基于Java Springboot旅游信息推荐系统
java·spring boot·旅游
岁月无声code1 小时前
Spring Boot 牛刀小试 org.springframework.boot:spring-boot-maven-plugin:找不到类错误
java·spring boot·github
不爱学习的YY酱1 小时前
【计网不挂科】计算机网络第二章< 物理层 >习题库(含答案)
java·数据库·计算机网络
南城花随雪。1 小时前
Spring框架之装饰者模式 (Decorator Pattern)
java·开发语言·装饰器模式
编程、小哥哥1 小时前
设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
java·设计模式·装饰器模式
hummhumm3 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang