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

2 篇文章 0 订阅
1 篇文章 0 订阅

完整原文(含源码):Github
(转载请注明出处,仅供分享学习,严禁用于商业用途)


环境


简介

此构件库为本人多年编程总结提炼而成,把常用的功能模块作为原子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
Base64Base64编解码 
  CharsetUtils字符集编码转换JUnit
  CompressUtils压缩/解压(zip,gzip,tar,bz2) 
  CryptoUtils加解密(MD5,DES,RSA)JUnit
  TXTUtils任意文件与txt文件互转 
 格式转换工具
format
ESCUtils数据格式转换
(转义字符,BCP,CSV,TSV)
JUnit
  JsonUtilsJSON数据处理 
  XmlUtilsXML数据处理 
  StandardUtils标准化处理 
 图像工具
img
ImageUtils图像处理 
  QRCodeUtils二维码生成/解析 
 读写工具
io
FileUtils磁盘文件处理 
  IOUtilsIO流处理 
  JarUtilsJar文件处理 
 数值工具
num
BODHUtils进制处理JUnit
  IDUtils唯一性ID生成器 
  NumUtils数值处理JUnit
  UnitUtils单位转换 
 系统工具
os
ExitUtils程序终止控制 
  JavaUtilsJava语言处理 
  OSUtils系统环境参数处理 
  ThreadUtils线程处理 
 日期/时间工具
time
DateUtils日期工具 
  TimeUtils时间工具 
 校验工具
verify
RegexUtils正则表达式处理JUnit
  VerifyUtils数据格式校验 
 其他工具
other
AnnotationUtils神ta喵注释生成器 
  BoolUtils布尔值处理 
  JSUtilsJavaScript脚本处理 
  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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值