【敏捷开发】经验构件库-Java版(exp-libs)

版权声明:[ EXP技术分享博客(http://exp-blog.com) ] 版权所有,转载请注明出处: https://blog.csdn.net/lyy289065406/article/details/82817317

完整原文(含源码):http://exp-blog.com/2018/09/22/pid-2382/
(转载请注明出处,仅供分享学习,严禁用于商业用途)


环境


简介

此构件库为本人多年编程总结提炼而成,把常用的功能模块作为原子API进行封装。

另外也借用了不少出色的第三方构件,在其之上进行二次封装。

过程中尽量确保了低耦合、高性能、强稳健、高复用、更易用等,确保能够满足日常开发需要、提高开发效率。

既然别人不甘造轮子,那我就来奠造基石
他人会用,只是用。我要用,则随心所欲


安装与使用

由于exp-libs封装了大量第三方构件,因此需要在开发环境直接导入到Maven的pom.xml文件使用,利用pom文件自动加载第三方依赖构件(若仅导入单个exp-libs.jar,有很多功能是无法使用的)。

<dependency>
  <groupId>exp.libs</groupId>
  <artifactId>exp-libs</artifactId>
  <version>1.1-SNAPSHOT</version>
</dependency>
  • POM坐标(精简版,过滤了不常用的第三方构件):
<dependency>
  <groupId>exp.libs</groupId>
  <artifactId>exp-libs-simple</artifactId>
  <version>1.1-SNAPSHOT</version>
</dependency>

功能模块

主模块 子模块 组件包/类 说明 测试
示例
常用工具包
exp.libs.utils
编码工具
encode
Base64 Base64编解码  
    CharsetUtils 字符集编码转换 JUnit
    CompressUtils 压缩/解压(zip,gzip,tar,bz2)  
    CryptoUtils 加解密(MD5,DES,RSA) JUnit
    TXTUtils 任意文件与txt文件互转  
  格式转换工具
format
ESCUtils 数据格式转换
(转义字符,BCP,CSV,TSV)
JUnit
    JsonUtils JSON数据处理  
    XmlUtils XML数据处理  
    StandardUtils 标准化处理  
  图像工具
img
ImageUtils 图像处理  
    QRCodeUtils 二维码生成/解析  
  读写工具
io
FileUtils 磁盘文件处理  
    IOUtils IO流处理  
    JarUtils Jar文件处理  
  数值工具
num
BODHUtils 进制处理 JUnit
    IDUtils 唯一性ID生成器  
    NumUtils 数值处理 JUnit
    UnitUtils 单位转换  
  系统工具
os
ExitUtils 程序终止控制  
    JavaUtils Java语言处理  
    OSUtils 系统环境参数处理  
    ThreadUtils 线程处理  
  日期/时间工具
time
DateUtils 日期工具  
    TimeUtils 时间工具  
  校验工具
verify
RegexUtils 正则表达式处理 JUnit
    VerifyUtils 数据格式校验  
  其他工具
other
AnnotationUtils 神ta喵注释生成器  
    BoolUtils 布尔值处理  
    JSUtils JavaScript脚本处理  
    ListUtils 队列/集合操作 JUnit
    LogUtils 日志设置。
基于org.slf4j(1.7.5)接口与
ch.qos.logback(1.0.13)封装
 
    ObjUtils 对象处理 JUnit
    PathUtils 路径处理  
    RandomUtils 随机生成器
(随机数、随机汉字、随机姓名等)
JUnit
    StrUtils 字符串处理  
二次封装组件
exp.libs.warp
版本管理组件
ver
  借助Sqlite以UI方式管理项目版本信息,
Maven项目发布插件自动化升级插件
的部分功能也依赖此组件实现
 
  函数解析组件
cep
  基于com.singularsys.jep(3.3.1)封装。
去除时效限制,并新增多种自定义函数
JUnit
  命令行组件
cmd
  封装系统命令行操作  
  配置解析组件
cmd
xml配置文件解析
xml
基于org.dom4j(1.6.1)封装,支持定时
刷新配置项、加载固有格式的配置区块。
数据库组件网络组件等均利用此组件
加载独立的配置区块
 
    ini配置文件解析
ini
未实装  
    kv配置文件解析
kv
未实装  
  数据库组件
db
关系型数据库工具
sql
基于com.cloudhopper.proxool(0.9.1)
封装,支持mysql/oracle/sqlite等。
提供连接池与JDBC两种数据库连接方
式、及多种常用的增删改查操作,且可
根据物理表模型反向生成JavaBean代码
JUnit
    Redis客户端组件
redis
基于redis.clients.jedis(2.9.0)封装。
支持单机/主从/哨兵/集群模式,屏蔽
不同模式之间获取实例连接的差异性
示例
  网络组件
net
Cookie组件
cookie
用于解析HTTP/HTTPS响应头中的
Set-Cookie参数
 
    FTP组件
ftp
未实装  
    HTTP/HTTPS组件
http
提供在HTTP/HTTPS协议下,以长/短
连接实现的GET、POST、Download
方法,并支持自动解析Gzip流。
基于java.net.HttpURLConnection
commons-httpclient(3.1-rc1)封装,
更借助org.bouncycastle.bcprov
-jdk15on(1.54)使得可以在JDK1.6+环
境均支持HTTPS-TLSv1.2协议(详见)
 
    Email组件
mail
基于javax.mail(1.4.1)封装,
可用于邮件发送/抄送(支持加密)
JUnit
    MQ组件
mq
未实装(jms/kafka)  
    端口转发器
pf
利用Socket实现的端口转发程序 示例
    Ping组件
ping
利用系统命令实现的ping/tracert,支持
解析中/英文的win/linux系统的结果集
 
    Socket组件
sock
封装IO/NIO模式的Socket客户端/服务
端的交互行为,只需实现业务逻辑
示例
    Telnet组件
telnet
未实装  
    Webkit组件
webkit
基于org.seleniumhq.selenium(2.53.0)
封装,主要提供无头浏览器
com.codeborne.phantomjsdriver(1.2.1)
的常用操作
 
    WebSocket客户端
websock
基于org.java-websocket(1.3.4)封装,
支持ws与wss,提供数据帧的收发接口
 
    WebServices组件
wsdl
基于net.webservices.client(1.6.2)
装,支持http/axis2/cxf,支持SSL模式
 
  IO组件
io
流式读取器
flow
流式读取超大文件/字符串  
    文件监听器
listn
可监听并触发指定目录树下所有
文件/文件夹的增删改事件
 
    批量序列化读写器
serial
批量序列化/反序列任意实现了
java.io.Serializable接口的对象
 
  OCR图文识别
ocr
  基于com.sun.media.jai-imageio
(1.1-alpha)封装。
可识别图片中打印体的文字
(文字不能旋转、变形,越正规的
文字识别率越高)
示例
  定时任务调度
task
在线生成cron表达式 基于org.quartz-scheduler(2.2.1)
封装。仅保留了simple与cron调度器,
并提供cron表达式换算对象
示例
  线程组件
thread
  提供抽象循环线程、回调线程池组件  
  模板文件组件
tpl
  可定制含占位符的内容模板文件  
  Swing界面工具
ui
Swing组件
cpt
部分功能基于org.jb.beauty-eye(3.7)
封装。可美化Swing外观,提供主窗口、
浮动窗口、面板、表单、选框、系统托
盘、布局样式等常用组件
示例
    拓扑图绘制器
topo
基于org.eclipse.draw2d(1.0.0)
org.jgraph.jGraph(1.0.0)封装。
通过输入邻接矩阵(可含源宿点/必经
点)自动根据边权换算边距,同时映射
到极坐标系,绘制对应的拓扑图
示例
  Excel组件
xls
  基于org.apache.poi.poi-ooxml(3.9)
封装。支持对xls/xlsx文件操作
示例
算法包
exp.libs.algorithm
基本算法
basic
  排序、布隆过滤器、哈夫曼编码、
哈希算法等(未实装)
 
  数据结构
struct
拓扑图
graph
拓扑图模型
(支持有向/无向、源宿点、必经点)
 
    队列
queue
循环队列、生产者消费者队列、
优先队列、流式并发队列等
示例
    红黑树
rbt
未实装  
  搜索
search
  未实装  
  数学
math
数学算法
MathUtils
归一化函数、卡马克浮点数快速算法、
异或交换、二进制计数等
 
    素数
Prime
埃拉托斯特尼筛法
时/空复杂度:O(n)
 
    矩阵运算
Mat
未实装  
  图论
graph
  未实装  
  计算几何
gmtry
  未实装  
  动态规划
dync
  未实装  
  最短路径算法
spa
Dijkstra 适用单源最短路问题
时间复杂度:O(V * lgV+E)
测试
    BellmanFord 适用单源最短路问题(未实装)
时间复杂度:O(V * E)
空间复杂度:O(V + E)
 
    SPFA (BellmanFord的优化版(未实装)
时间复杂度:O(k * E)
空间复杂度:O(V + E)
 
    Johonson 适用全源最短路问题(未实装)
时间复杂度:O(V * E * lgV)
 
    Floyd 适用全源最短路问题(未实装)
时间复杂度:O(V^3)
空间复杂度:O(V^2)
 
  启发式算法
heuristic
aca 蚁群算法(未实装)  
    qaca 量子蚁群算法(引入量子环境改进的
蚁群算法:量子比特、量子概率幅、
量子态、量子旋转门等)
示例
  NP难问题
np
ispa 含必经点的最短路问题:
自动根据场景用spa启发式算法求解
测试
    tsp 旅行商问题(未实装)  
  深度学习
dl
tensorflow 基于org.tensorflow(1.6.0)封装。
提供TensorFlow训练模型调用接口
 

第三方构件修正记录

修正commons-httpclient-3.1重定向丢失cookie问题

<dependency>
  <groupId>commons-httpclient</groupId>
  <artifactId>commons-httpclient</artifactId>
  <version>3.1-rc1</version>
</dependency>

使用此版本的HttpClient访问一个会发生重定向跳转的URL时,会自动执行跳转,直到跳转到最后一个目标URL为止,而这个自动的重定向行为无法被禁止。由此会发生两个现象:

  1. 使用HttpClient访问原始URL后,直接返回的状态码就是200 (而非302)
  2. 得到的Response Header是最后一个URL的Response Header,而中间跳转的URL的Response Header全部丢失

第1点 其实影响不大,但 第2点 会导致中间跳转的URL所返回的Set-Cookie丢失

对爬虫开发而言,这个问题是致命的:
如要模拟登陆时,通常登陆成功后会返回cookie并自动重定向到网站主页,而这个过程中丢失了cookie就相当于登陆失败。

因此主要针对 第2点 修正如下:
记录中间所有URL返回的Response Header中的Set-Cookie,并全部追加到最后一个URL的Response Header中


修正JDK1.6/1.7不支持TLSv1.2协议的HTTPS问题

<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk15on</artifactId>
  <version>1.54</version>
</dependency>

Bouncy Castle是一种用于 Java 平台的开放源码的轻量级密码术包,它支持大量的密码术算法,并提供JCE 1.2.1的实现

JDK1.6/1.7仅支持遵循TLSv1.1协议的HTTPS访问,若网站强制要求使用TLSv1.2协议,JDK1.6/1.7会直接报错。

为了解决这个问题,从而引入Bouncy Castle重写JDK的默认SSLSocket的通信安全密级协议,使得JDK1.6/1.7支持TLSv1.2。

由于JDK1.8已支持TLSv1.2,因此此问题仅针对JDK1.6/1.7环境


屏蔽proxool-0.9.1连接池调试日志

<dependency>
  <groupId>com.cloudhopper.proxool</groupId>
  <artifactId>proxool</artifactId>
  <version>0.9.1</version>
</dependency>

此版本的连接池在运行期间会打印很多并非slf4j所打印的调试日志(基本都是使用commons-logging打印),无法通过配置屏蔽之,导致程序输出混乱。

为此强制注释相关日志代码禁止其输出调试日志


重写commons-io-2.4返回值

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
</dependency>

主要针对其中的org.apache.commons.io.FileUtils的函数返回值进行重写:
把其中的void返回值修正为boolean,并捕获相关抛出的异常,以便进行二次封装


修正构造函数可见性

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.9</version>
</dependency>

修改org.apache.poi.xssf.usermodel.XSSFHyperlink的可见性为public,以便进行二次封装


去除类的final声明

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.1</version>
</dependency>

去除类org.quartz.CronExpression的final声明,以便进行二次封装


版权声明

Copyright (C) 2016-2018 By EXP License: GPL v3


猜你喜欢

转载自blog.csdn.net/lyy289065406/article/details/82817317