health4j—Java项目的全面体检工具

最近利用业余时间写了一个Java代码静态分析工具的聚合器。集成了三种主流的静态分析工具:pmdcheckstylefindbugs。可以用这三种工具提供的几千种规则集,来给你的项目进行全面体检,同时附带了归纳整理并提供邮件通知。代码开源在github上,取名为health4j

开发这个工具的初衷是希望它能约束自己代码的规范性。同时,引导自己采用一些已被业界认可的“最佳实践”,保证至少自己的代码更加“health”。写它的另一个目的,是继续我的个人爱好——“自动化”工具。

代码的整洁、规范,对于一个软件项目的重要性不言而喻。特别是那些曾经维护过别人遗留代码的人,相信你们都深有感触。但不要说别人,即便是我们自己写的代码,隔个三五个月自己再回头看,有时也是不知所云。当然对于代码缺陷而言,更可能会成为影响项目健壮性的一个定时炸弹。因此我认为,此举至少对我个人而言是有利的。

分析工具简介

这三个Java界的主流静态代码分析工具的对比:

需要说明的是,checkstyle主要用于检查代码书写规范。pmd,findbugs则是非常出名的缺陷分析工具。它们收集了非常多的检查规则和缺陷模式。其中pmd用于分析java源码,而findbugs分析的是java编译后的字节码,jtest是商业工具,目前并未集成。

设计

逻辑结构图:

该项目目前提供了三个分析工具的实现。每个工具都被拆分为三个部件:EnvVerifier(环境验证器),CommandInvoker(命令执行器),ReportExtractor(报告提取器)。每个工具的执行,在内部都会触发这三个部件的依次执行。并且每个工具都被内聚为一个任务,以供在线程池中并发执行。

每个工具的运行,都会伴随着输出自己的xml格式的报表文件。根据配置文件中是否启用了合并器,来决定是否需要对每个工具输出的报表文件作解析并提取(ReportExtractor),以供下面的聚合器聚合之用。

如果开启了聚合器,从每个工具输出的报表文件中,提取出公共的数据信息(来自于每个工具数据信息的抽象),然后根据给定的聚合模板,生成一份聚合后的html报表。

如果开启了通知器,那将会根据通知器的实现(默认给出的是邮件通知),将聚合后的html发送给目标。

类图结构:

从代码的设计图中可看出,每个动作都有与之对应的接口抽象。因此虽然只提供了三个工具的实现,但它仍然有良好的扩展性。只需提供相应的接口实现,并定义好需要的配置文件信息,可以添加更多的分析工具。在每个工具的实现上,添加图中的Tool注解,并标明其名称(name属性)。health4j在运行时,会自动扫描到该实现,并将其加入到线程池中执行。

Java SE的服务加载器

在开发web项目的时候,我们通常会引入spring来作为Ioc容器,这样我们可以将抽象与具体的实现隔离。但对于一个小的standalone项目,这么做似乎有些杀鸡用牛刀的感觉。不过幸好JDK自1.6版本后就提供了SPI(ServiceProvider Interface)的默认实现。有了它,你在写一些小工具的时候,不用spring这么“重”的bean容器,也可以实现Ioc。具体的做法很简单。它提供了一个ServiceLoader的泛型类。会从一个指定的位置加载对某个Service(该Service通常被定义为一个接口或抽象类)实现的配置。

比如这里的两个服务接口:ReportMerger,ReportNotifier。我们首先在一个项目的资源文件夹内创建一个名为“META-INF.services”文件夹。然后里面创建两个配置文件。每个配置文件都以接口的完全限定名作为文件名称:

而每个文件的内容也异常简单,你只需要指定该服务接口的提供者(实现类)的完全限定名即可:

com.freedom.health4j.api.impl.common.DefaultMerger

这样在获取该接口提供者的时候,我们便无需显示将该提供者的实例化过程与该服务绑定。示例:

private static void merge(ReportInfo reportInfo) {
        if (Boolean.valueOf(commonConfig.getProperty(Constants.COMMON_ENABLE_MERGE_KEY))) {
            ServiceLoader<ReportMerger> serviceLoader = ServiceLoader.load(ReportMerger.class);
            Iterator<ReportMerger> mergerIterator = serviceLoader.iterator();

            if (!mergerIterator.hasNext()) {
                throw new RuntimeException("can not load service provider for service : ReportMerger");
            }

            ReportMerger merger = mergerIterator.next();
            merger.setCommonConfig(commonConfig);
            merger.merge(reportInfo);
        }
    }

虽然这种方式不及Spring等专业Ioc容器那样强大。不过对于开发一些工具类的小应用而言,却是非常简单并且实用。

使用与集成

该工具可作为独立的jar执行,也可以构建为unix-like-service(见)。当然作为自动化的一部分,我们仍然希望有非人为因素之外的其他触发条件。这里,可以列举几个常用的触发条件:

  • 时间触发:利用linux定时任务在指定的时间触发
  • 事件触发:在VCS等代码版本控制软件的hook中触发
  • 持续集成:通过maven/ant等构建工具的task触发

无论哪种触发方式,该工具首先需要发布到项目的源代码所宿主的服务器上去。并且每个工具拥有者自己的规则集合,这些规则都可配置,它们都位于release/conf文件夹内。

其运行结果示例如下图:

综述

很多事情的发展都有着相似的历程:从最初的固执己见到最后的遵循标准。标准代表了各自利益的共同部分,如果你的团队到现在还没有形成统一的代码风格,到现在还没有意识到采用最佳实践是避免缺陷的最终选择,那么你需要这份工具。当然有了这份工具才只是第一步,它只是一个你是否执行标准的检查器。下一步才是关键:你们需要坐下来商讨哪些是值得你们为之改变规则,也就是你们希望形成的标准。

项目地址:https://github.com/yanghua/health4j

时间: 2024-10-09 23:41:58

health4j—Java项目的全面体检工具的相关文章

【转】Java 项目UML反向工程转化工具

原文链接:http://www.cnblogs.com/bakari/p/3561207.html 今天在看一个模拟器的源码,一个包里有多个类,一个类里又有多个属性和方法,如果按顺序看下来,不仅不能对整个模拟器的框架形成一个大致的认识,而且只会越看越混乱,所以,想到有没有什么工具可以将这些个类以及它们之间的依赖关系转化成UML图,这样一看图就能一目了然.立刻搜了看,没想到这样的工具一大堆,下面罗列最经典的6款.参考:http://www.csdn.net/article/2012-09-12/2

在MyEclipse的web项目/java项目中,使用Hibernate-tools中的hbm2java和hbm2ddl工具,根据hbm文件自动生成pojo和数据库脚本

     首先,我一定要吐槽下,这个Ant管理部署项目的工具,以及hibernate刚刚学习,导入我这一个简单的问题整了一天多,实在效率有点低下.在这两天中,①了解了Ant,知道了在Ant中很灵活的步骤项目的情况,知道了build.xml文件的一些基本写法.②还学习了在MyEclipse这样的集成工具中完成项目部署.③以及在这两种情况中,利用hibernateTools中的hbm2java和hbm2ddl工具,根据对象关系映射文件,自动生成POJO以及SQL文件(就是数据表). 一,在web项目

在MyEclipse的web项目/java项目中,使用Hibernate-tools中的hbm2java和hbm2ddl工具,依据hbm文件自己主动生成pojo和数据库脚本

     首先.我一定要吐槽下,这个Ant管理部署项目的工具.以及hibernate刚刚学习,导入我这一个简单的问题整了一天多.实在效率有点低下. 在这两天中,①了解了Ant.知道了在Ant中非常灵活的步骤项目的情况,知道了build.xml文件的一些基本写法.②还学习了在MyEclipse这种集成工具中完毕项目部署. ③以及在这两种情况中.利用hibernateTools中的hbm2java和hbm2ddl工具,依据对象关系映射文件,自己主动生成POJO以及SQL文件(就是数据表). 一,在w

Java项目打包工具安装失败解决方法

在学习Java的时候我们打包项目但遇到如下情况:(提示没有找到java的运行环境!) 网上目前有两中的解决方案: (1)选择本地jdk环境; (2)下载Download 但是第一种选择本地老是失败(方法:点Locate找到你机器上已安装的JDK目录下/bin/java.exe就可以进行安装了) 目前我还没有解决的(如果成功的话,算你走运) 然后使用第一种但是下载的时候也是不能下载,解决方法.,换一个软件在重试,下载地址:http://www.pc6.com/softview/SoftView_6

持续集成工具jenkins部署发布JAVA项目(二)

一.部署环境系统 Centos7和上期的jenkins在一台主机,jenkins服务使用的tomcat是8080端口,本次JAVA项目部署使用的tomcat是8090端口 二.部署流程和所需工具 所需工具: maven.tomcat 三.部署过程1.修改部署JAVA项目的tomcat端口为8090将解压的tomcat包放到/opt下修改端口为8090vim conf/server.xml将所有端口号都加10 ,防止与主服务冲突 2.在jenkins上创建testDeploy任务 设置jenkin

Maven——项目管理工具,可以对 Java 项目进行构建、依赖管理。

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑.当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件. Maven

java代码分析及分析工具

java代码分析及分析工具 一个项目从搭建开始,开发的初期往往思路比较清晰,代码也比较清晰.随着时间的推移,业务越来越复杂.代码也就面临着耦合,冗余,甚至杂乱,到最后谁都不敢碰. 作为一个互联网电子商务网站的业务支撑系统,业务复杂不言而喻.从09年开始一直沿用到现在,中间代码经过了多少人的手,留下了多少的坑,已经记不清楚了,谁也说不清了. 代码的维护成本越来越高.代码已经急需做调整和改善.最近项目组专门设立了一个小组,利用业余时间做代码分析的工作,目标对核心代码进行分析并进行设计重构. 代码分析

Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下: Manifest-Version: 1.0 Class-Path: lib/commons-codec.jar lib/commons-httpclient-3.1.jar lib/commons-logging-1.1.jar lib/log4j-1.

使用Maven构建Java项目

一.Maven是什么? Maven 是一个项目管理和构建自动化工具.Maven基于POM(Project object model),能够管理项目的构建.报表.文档等信息. 我们这里主要讲的Maven的项目构建功能.有了Maven,我们可以方便的管理Java项目的生命周期和依赖.通过定义一个POM文件,我们就可以自动的完成编译.测试.打包甚至发布等过程. 二.为什么要用Maven? 做过Java项目的童鞋都知道,一个项目中Java代码经常会依赖其他的jar包中的class,或者依赖其它的项目,手