【敏捷開發】經驗構件庫-Java版(exp-libs)
完整原文(含原始碼):http://exp-blog.com/2018/09/22/pid-2382/
(轉載請註明出處,僅供分享學習,嚴禁用於商業用途)
環境
簡介
此構件庫為本人多年程式設計總結提煉而成,把常用的功能模組作為原子API進行封裝。
另外也借用了不少出色的第三方構件,在其之上進行二次封裝。
過程中儘量確保了低耦合、高效能、強穩健、高複用、更易用等,確保能夠滿足日常開發需要、提高開發效率。
既然別人不甘造輪子,那我就來奠造基石
他人會用,只是用。我要用,則隨心所欲
安裝與使用
由於exp-libs
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: [email protected]