经验构件库(已废弃)
公告:因很多依赖包已过时,故放弃维护,以后转至重构版 exp-libs-refactor 仓库中维护。
此构件库为本人多年编程总结提炼而成,把常用的功能模块作为原子API进行封装。
另外也借用了不少出色的第三方构件,在其之上进行二次封装。
过程中尽量确保了低耦合、高性能、强稳健、高复用、更易用等,使之能够满足日常开发需要、提高开发效率。
既然别人不甘造轮子,那我就来奠造基石
他人会用,只是用。我要用,则随心所欲
由于 exp-libs
依赖了大量第三方构件并封装,若仅导入本项目的 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>
含有此构件的 Nexus 仓库(需要切换到 produce 分支并使用 docker 运行)
主模块 | 子模块 | 组件包/类 | 说明 | 测试 示例 |
---|---|---|---|---|
常用工具包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 |
基于org.dtools.javaini(1.1.0.0) 封装扩展对ini文件的编码支持范围 |
示例 |
||
数据库组件 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 |
未实装 | |||
最短路径算法
|
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) |
|||
启发式算法
|
aca |
蚁群算法(未实装) | ||
qaca |
量子蚁群算法(引入量子环境改进的 蚁群算法:量子比特、量子概率幅、 量子态、量子旋转门等) |
示例 |
||
NP难问题np |
ispa |
含必经点的最短路问题: 自动根据场景用 spa 或启发式算法 求解 |
测试 |
|
tsp |
旅行商问题(未实装) | |||
深度学习dl |
tensorflow |
基于org.tensorflow(1.6.0) 封装。提供TensorFlow训练模型调用接口 |
<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中。
<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环境
<dependency>
<groupId>com.cloudhopper.proxool</groupId>
<artifactId>proxool</artifactId>
<version>0.9.1</version>
</dependency>
此版本的连接池在运行期间会打印很多并非slf4j
所打印的调试日志(基本都是使用commons-logging
打印),无法通过配置屏蔽之,导致程序输出混乱。
为此强制注释相关日志代码禁止其输出调试日志。
<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,以便进行二次封装。
<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