原文:https://dzone.com/articles/20-useful-open-source-libraries-for-java-programmehtml
優秀和經驗豐富的Java開發人員的一個特色是對API的普遍瞭解,包括JDK和第三方庫。我花了大量時間學習API,特別是在閱讀了「Effective Java 第3版」以後,Joshua Bloch建議如何使用現有的API進行開發,而不是爲普通的東西編寫新的代碼。java
這個建議對我來講頗有意義,由於第二方庫的測試表現。在本文中,我將分享一些Java開發人員應該熟悉的最有用和最基本的庫和API。可是,我不包括框架,例如Spring和Hibernate,由於它們很是有名,而且具備特定的特性。程序員
一般,我會爲平常項目提供有用的庫,包括日誌庫(如Log4j)、JSON解析庫(如Jackson)、單元測試API(如JUnit和Mockito)。若是您須要在項目中使用它們,那麼您能夠將這些庫的JAR包含在項目的類路徑中,以開始使用它們,或者可使用Maven進行依賴項管理。數據庫
當您使用Maven進行依賴關係管理時,它將自動下載這些庫,包括它們所依賴的庫,稱爲傳遞依賴關係。apache
例如,若是您下載Spring框架,它還將下載Spring所依賴的全部其餘JAR,例如Log4j。編程
您可能沒有意識到,可是擁有正確版本的依賴JAR是一個很大的頭痛。若是您有錯誤的JAR版本,那麼您將得到ClassNotFoundException、NoClassDefFoundError或UnsupportedClassVersionError。數組
下面是我收集的一些有用的第三方庫,Java開發人員能夠在他們的應用程序中使用這些庫來完成許多有用的任務。爲了使用這些庫,Java開發人員應該熟悉這些庫,這就是本文的所有要點。若是你有一個想法,那麼你就能夠研究並使用它。瀏覽器
日誌庫很是常見,由於在每一個項目中都須要它們。對於服務器端應用程序來講,日誌是最重要的,由於日誌只放在能夠查看應用程序運行狀況的地方。儘管JDK附帶了本身的日誌庫,但還有更好的選擇,例如Log4j、SLF4j和Logback。安全
Java開發人員應該熟悉日誌庫的優缺點,並知道爲何使用SLF4j比使用普通Log4j更好。若是你不知道爲何,我建議你讀關於同一主題的文章。服務器
在當今Web服務和物聯網的世界中,JSON已經成爲將信息從客戶端傳送到服務器的一種訪問協議。它們取代了XML,成爲以獨立於平臺的方式傳輸信息的首選方式。
不幸的是,JDK沒有JSON庫。可是,有許多很好的第三方庫可讓您解析和建立jSON消息,好比Jackson和gson。
Java Web開發人員至少應該熟悉其中的一個庫。若是您想了解Jackson和JSON的更多信息,本身學。
單元測試是將普通開發人員與優秀開發人員區分開來的最重要的一件事。程序員常常有藉口不編寫單元測試,但最多見的逃避單元測試的藉口是缺少對流行的單元測試庫(包括JUnit、Mockito和PowerMock)的經驗和知識。
2018年,個人目標是提升我對單元測試和集成測試庫的瞭解,好比JUnit 五、Cucumber、Robot framework等等。
Java開發人員可使用一些好的、通用的第三方庫,好比Apache Commons 和 Google Guava。我老是在個人項目中包括這些庫,由於它們簡化了許多任務。
正如Joshua Bloch在「EffectiveJava」一書中正確地指出的那樣,從新發明輪子是沒有意義的。咱們應該更喜歡使用嘗試過的和通過測試的庫,而不是時不時地編寫本身的例程。
對於Java開發人員來講,熟悉GoogleGuava和ApacheCommonsLibrary是件好事。
我不喜歡JDK的一件事是他們缺少對HTTP的支持。雖然您可使用java.net.Package中的類創建HTTP鏈接,可是使用像apache httpClient和httpCore這樣的開源第三方庫並不那麼容易或無縫。
儘管JDK 9帶來了對HTTP2.0的支持和對HTTP的更好支持,但我強烈建議全部Java開發人員熟悉流行的HTTP客戶端庫,包括HttpClient和HttpCore。
您還能夠查看文章,瞭解更多關於JDK 9的HTTP 2支持的內容。
有許多XML解析庫,包括Xerces、JAXB、JAXP、Dom4j和Xstream。Xerces 2是ApacheXerces家族中的下一代高性能、徹底兼容的XML解析器。這個新版本的Xerces引入了Xerces components接口(XNI),這是一個構建解析器組件和配置的完整框架,很是模塊化,易於編程。
Apache Xerces 2解析器是XNI的參考實現,但其餘解析器組件、配置和解析器可使用Xerces native接口編寫。Dom4j是另外一個適用於Java應用程序的靈活的XML框架。
信不信由你,全部現實世界的應用程序都必須以某種形式與MicrosoftOffice進行交互。許多應用程序須要提供在Excel中導出數據的功能,若是必須從Java應用程序中導出數據,則須要ApachePOIAPI
這是一個很是豐富的庫,容許您從Java程序讀取和寫入XLS文件連接。
若是您正在編寫生成代碼或與字節碼交互的框架或庫,那麼您須要一個字節碼庫。
Javassist(JJAVA programming ASSISTant)使Java字節碼操做很是簡單。它是一個類庫,用於編輯Java中的字節碼。ASM是另外一個有用的字節碼編輯庫。若是您不熟悉字節碼,我建議您看一下java程序員的介紹,以便了解更多有關字節碼的內容。
若是您正在與來自Java應用程序的數據庫進行交互,但沒有使用數據庫鏈接池庫,那麼您就缺乏了一些東西。
因爲在運行時建立數據庫鏈接須要時間並使請求處理更慢,因此建議始終使用DB鏈接庫。其中一些流行的是CommonsPool和DBCP。
在Web應用程序中,它的Web服務器一般提供這些功能,但在覈心Java應用程序中,須要將這些鏈接池庫包含到類路徑中才能使用數據庫鏈接池。
與日誌記錄和數據庫鏈接相似,消息傳遞也是許多實際Java應用程序的一個常見特性。
Java提供JMS或Java消息服務,這不是JDK的一部分。對於這個組件,您須要包含一個單獨的jms.jar。
相似地,若是您使用第三方消息傳遞協議,好比tibco rv,那麼您須要在應用程序類路徑中使用第三方jar-tibrv.jar。
與Microsoft Excel相似,PDF庫是另外一種廣泛存在的格式。若是您須要在應用程序中支持PDF功能,例如導出PDF文件中的數據,則可使用iText和ApacheFOP庫。
二者都提供了有用的PDF相關功能,但iText更豐富、更好。
在Java 8以前,jdk的數據和時間庫有不少缺陷,由於它們不是線程安全的、不可變的和容易出錯的。許多Java開發人員依賴於JodaTime來實現他們的日期和時間需求。
在JDK 8中,沒有理由使用Joda,由於您在JDK 8的新日期和時間API中得到了全部這些功能,可是若是您使用的是較舊的Java版本,那麼JodaTime是一個值得學習的庫。
儘管jdk有一個豐富的藏書庫,但也有一些第三方庫提供了更多的選項,好比apache CommonsCollection、goldmansachs、google和trove。
Trove庫特別有用,由於它爲Java提供了高速、常規和原始的集合。
FastUtil是另外一個相似的API。它經過提供具備小內存佔用、快速訪問和插入的特定類型映射、集合、列表和優先級隊列來擴展Java集合框架;它還提供大(64位)數組、集合和列表,併爲二進制文件和文本文件提供快速、實用的I/O類。
Mail和ApacheCommonsEmail都提供了從Java發送電子郵件的API。它構建在JavaMailAPI之上,目的是簡化它。
與JSON和XML相似,HMTL是咱們許多人必須處理的另外一種常見格式。值得慶幸的是,咱們有JSoup,它極大地簡化了Java應用程序中HTML的工做。
您不只可使用JSoup解析HTML,還能夠建立HTML文檔
它提供了一個很是方便的API來提取和操做數據,使用最好的DOM、CSS和jQuery類方法。JSoup實現WHATWGHTML 5規範,並像現代瀏覽器同樣將HTML解析爲相同的DOM。
ApacheCommonsCodec包含用於各類格式(如base 64和十六進制)的簡單編碼器和解碼qi(這個詞竟然敏感!)。
除了這些普遍使用的編碼器和解碼qi以外,編解碼程序包還維護一組語音編碼實用程序。
我很是喜歡內存中的數據庫,好比H2,您能夠將它嵌入到Java應用程序中。它們很適合測試SQL腳本和運行須要數據庫的單元測試。可是,H2不是惟一的DB,您還能夠選擇ApacheDerby和HSQL。
有一些很好的JDBC擴展庫存在,可使調試變得更容易,好比P6spy。
這是一個庫,能夠無縫地攔截和記錄數據庫數據,而不會對應用程序進行代碼更改。您可使用這些記錄SQL查詢及其時間。
例如,若是在代碼中使用PreparedStatment和CallableStatement,則這些庫能夠記錄帶有參數的準確調用,以及執行所花費的時間。
GoogleProtocol緩衝區是一種以高效但可擴展的格式編碼結構化數據的方法。它是Java序列化的一個更豐富和更好的選擇。我強烈建議有經驗的Java開發人員學習GoogleProtobuf。您能夠經過本文了解有關Google Protocol Buffer緩衝區的更多信息。
一些有用的網絡庫是Netty和ApacheMina。若是您正在編寫須要執行低級別網絡任務的應用程序,請考慮使用這些庫。若是您想了解更多關於Java網絡編程的知識,請查看Java Network Programming - TCP/IP Socket Programming。
到目前爲止,全部Java開發人員都應該使用一些有用的庫。Java領域是巨大的,您會發現大量的庫用於作不一樣的事情。
若是您想在Java中作任何事情,那麼您極可能會找到一個關於如何這樣作的庫。與往常同樣,Google是您查找有用Java庫的最好朋友,可是您也能夠查看Maven中央存儲庫,以找到一些適合您手頭任務的有用庫。
有什麼討論的內容,能夠加我公衆號: