1. 程式人生 > >【敏捷開發】經驗構件庫-Java版(exp-libs)

【敏捷開發】經驗構件庫-Java版(exp-libs)

完整原文(含原始碼):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