完整原文(含源码):Github
(转载请注明出处,仅供分享学习,严禁用于商业用途)
环境
简介
此构件库为本人多年编程总结提炼而成,把常用的功能模块作为原子API进行封装。
另外也借用了不少出色的第三方构件,在其之上进行二次封装。
过程中尽量确保了低耦合、高性能、强稳健、高复用、更易用等,确保能够满足日常开发需要、提高开发效率。
既然别人不甘造轮子,那我就来奠造基石
他人会用,只是用。我要用,则随心所欲
安装与使用
由于exp-libs
封装了大量第三方构件,因此需要在开发环境直接导入到Maven的pom.xml
文件使用,利用pom文件自动加载第三方依赖构件(若仅导入单个exp-libs.jar
,有很多功能是无法使用的)。
- 在线Javadoc
- POM坐标(完全版):
<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为止,而这个自动的重定向行为无法被禁止。由此会发生两个现象:
- 使用HttpClient访问原始URL后,直接返回的状态码就是200 (而非302)
- 得到的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声明,以便进行二次封装。
版权声明
- Site: http://exp-blog.com
- Mail: 289065406@qq.com