2016年JAVA程序员一定需要知道的优秀第三方库

liaoluo 8年前
   <p>几乎每个程序员都知道要“<strong>避免重复发明轮子</strong>”的道理——尽可能使用那些优秀的第三方框架或库,但当真正进入开发时,我却经常发现他们有时并不知道那些轮子在哪里。最近,我在业余时间带几个年轻的程序员一起做了一个很小的商业项目,而在一起开发的过程中,我几乎在所有需要判断字符串是否为空的地方,看到了下面的代码:</p>    <pre>  <code>if(inputString == null || inputString.length == 0){......}</code></pre>    <p>除了字符串判断是否为空之外,还有很多字符串处理或其他数据类型判断的方法,缺少经验的程序员们往往都会想办法自己来写。这些代码当然都没有错,但我们应该尽可能去利用那些已经非常成熟的第三方库,以更标准的方式去解决这些通用的问题,并且提高开发效率。</p>    <p>下面便是我整理的,在大部分项目中使用到的优秀JAVA第三方库 ,供大家参考:</p>    <h2>JAVA核心扩展</h2>    <p>正如前面说到的字符串判断的例子,JAVA的标准库虽然提供了那些最基本的数据类型操作方法,但仍然对一些常见的需求场景,缺少实用的工具类。而另一些则是JAVA标准库本身不够完善,需要第三方库去加以补充的。</p>    <p><a href="/misc/goto?guid=4959673038885648745">Apache Commons Lang</a></p>    <p>Apache Commons Lang是Apache最著名的JAVA库 (<a href="/misc/goto?guid=4959673038984834200">GitHub上的代码库</a>),它是对java.lang的很好扩展,包含了大量非常实用的工具类,其中用的最多的有StringUtils,DateUtils,NumberUtils等。之前提到的代码利用StringUtils可以改写为:</p>    <pre>  <code>if(StringUtils.isBlank(inputString)){...}</code></pre>    <p>除了Apache Commons Lang,还有一些其他的Apache库也是对JAVA本身的很好补充,如<a href="/misc/goto?guid=4958859623943458317">Apache Commons Collection</a>,<a href="/misc/goto?guid=4959615458774964321">Apache Commons IO</a>,<a href="/misc/goto?guid=4959624514033195165">Apache Commons Math</a></p>    <p><img src="https://simg.open-open.com/show/67398ac90fd5f1d8378ed1b30e4b06d5.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="743" height="118"></p>    <p>在Maven项目中加入Apache Commons Lang这个库:</p>    <pre>  <code><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-lang3</artifactId>    <version>3.4</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4958973085838435916">Google Guava</a></p>    <p>Google Guava在国内项目中很少使用,但我合作过的一些国外JAVA工程师几乎都会推荐这个JAVA库。它包含了Google在自己的JAVA项目中所使用的一些核心JAVA库。包含了对:<strong>集合,缓存,并发库,字符串处理, I/O</strong>等各个方面的支持。另外Google开发的库总是以性能著称。</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>19.0</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4958859584211905825">Joda-Time</a></p>    <p>Java SE 8之前的JAVA版本中对日期的支持是比较差的,Joda-Time被经常被使用来替换原有的日期系统,它能够支持更多的日历体系,并提供了很多非常方便的日期处理方法,而且它的性能也是非常出色的。(<a href="/misc/goto?guid=4958850469875074639">GitHub上的代码库</a>)</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>    <groupId>joda-time</groupId>    <artifactId>joda-time</artifactId>    <version>2.9.3</version>  </dependency></code></pre>    <h2>Web框架</h2>    <p>Web框架是一个应用最核心的部分,因此我总是推荐使用那些最标准的,并且有良好社区支持的框架,比如Spring和Struts。</p>    <p><a href="/misc/goto?guid=4959673039263454165">Spring</a></p>    <p>Spring是一个开源的应用框架,它包含很多子项目比如Spring MVC, Spring Security, Spring Data,Sping Boot等等,几乎可以满足你项目上的所有需要。它也是我开发Web项目的首选后端框架。(<a href="/misc/goto?guid=4958869028435442264">GitHub上的代码库</a>)</p>    <p><img src="https://simg.open-open.com/show/1908fff1eee65ed02449880f5786e217.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="774" height="311"></p>    <p>添加下面的引用,在Spring MVC项目中加入这个库(以下仅引入Spring Core的支持)</p>    <pre>  <code><dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-core</artifactId>      <version>4.2.5.RELEASE</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4959673039387596602">Struts 2</a></p>    <p>Struts 2 是Apache最有名的Web框架,它也是一个免费开源的MVC框架。Struts也能很好地支持REST,SOAP,AJAX等最新技术。(<a href="/misc/goto?guid=4959673039477818307">GitHub上的代码库</a>)</p>    <p><img src="https://simg.open-open.com/show/6806ab105e6e03e5ab91e32b5900044b.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="758" height="350"></p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>org.apache.struts</groupId>      <artifactId>struts2-core</artifactId>      <version>2.3.28</version>  </dependency></code></pre>    <p>除了上面提到的两个最长哟你的Web框架之外,还有如<a href="/misc/goto?guid=4958838081338395972">Google Web Toolkit</a>, <a href="/misc/goto?guid=4958201500037940456">Tapestry</a>, <a href="/misc/goto?guid=4959673039628121426">Strips</a>等一些优秀的框架可供选择 。</p>    <h2>数据库(持久层)</h2>    <p>持久层框架的选择对一个项目的成败同样非常关键,它会直接影响到系统的性能、质量、安全以及稳定性。</p>    <p><a href="/misc/goto?guid=4959667912014138193">MyBatis</a></p>    <p>MyBatis是我最喜欢的数据库(持久层)框架,因为它完全是基于SQL语句的(通过SQL来提取数据并自动映射为所需的数据对象),能够为我带来足够的灵活性。(<a href="/misc/goto?guid=4959673039751527174">GitHub上的代码库</a>)</p>    <p><img src="https://simg.open-open.com/show/1312c627ab930670f47966cc0a40c67d.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="787" height="152"></p>    <p><br> 添加下面的引用,在Maven项目中加入这个库(如需配合Spring使用,可选择对应的Maven库)</p>    <pre>  <code><dependency>      <groupId>org.mybatis</groupId>      <artifactId>mybatis</artifactId>      <version>3.4.0</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4959673039263454165">Spring JDBC</a> / <a href="/misc/goto?guid=4959673039858737409">Spring Data</a></p>    <p>Spring JDBC并不是独立的Spring子项目,而是一个整合在Spring核心库内,为JDBC操作提供基本封装处理的模块。通过简单的配置后,可以通过对Context中的jdbcTemplate进行调用来获得结果。</p>    <pre>  <code>String SQL = "select name from Student where id = ?";  String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);</code></pre>    <p>Spring Data是Spring的一个子项目,提供了更加强大的持久层功能封装,和对象映射功能。它能与Spring MVC很好地整合。你可以利用JPA和CrudRepository来极大简化持久层的开发。</p>    <pre>  <code>public interface EmployeeRepository extends CrudRepository<Employee, Long> {        Employee findByFirstName(String firstName);        List<Employee> findByLastName(String lastName);  }</code></pre>    <p><img src="https://simg.open-open.com/show/4097df5c529a10a2492020de97627ea5.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="723" height="344"></p>    <p><a href="/misc/goto?guid=4958189994746715943">Hibernate</a></p>    <p>可能是国内用得最广泛的持久层框架了,它非常强大,但用好它并不容易,你需要了解它的内部机制,否则可能会出现一些无法预见的性能问题,特别是在数据量特别大的时候。(<a href="/misc/goto?guid=4959549450227059577">GitHub上的代码库</a>)</p>    <p><img src="https://simg.open-open.com/show/c522f43d3c6a5b3b2a9a16baf8d19c5a.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="698" height="106"></p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>org.hibernate</groupId>      <artifactId>hibernate-core</artifactId>      <version>5.1.0.Final</version>  </dependency></code></pre>    <p>除了上面一些最常用的持久层库,还有几个优秀的库,比如 <a href="/misc/goto?guid=4959673040013106920">JDO</a>,<a href="/misc/goto?guid=4958333388726067523">JOOQ</a>,<a href="/misc/goto?guid=4958837539619798324">Apache DbUtils</a>等</p>    <h2>日志</h2>    <p>JAVA中也包含了日志记录功能,但它在处理日志分级,日志的存储,以及日志的备份、归档方面都不够出色,因此在项目中我们一般都会使用第三方日志库来处理日志。</p>    <p><a href="/misc/goto?guid=4958196689669996176">SLF4J- Simple Logging Facade for Java (SLF4J)</a></p>    <p>SLF4J为我们提供了一个日志服务的抽象层,基于它你可以选择不同的日志实现,比如:java.util.logging,logback,log4j,当你需要改变日志实现组件时,不需要修改任何代码,只需要更改一些相应的配置就可以了。(<a href="/misc/goto?guid=4959673040191386271">GitHub上的代码库</a>)</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-api</artifactId>      <version>1.7.21</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4958521827512185851">Apache Log4j</a></p>    <p>Log4j是最有名的日志组件,通过简单的配置后就能在程序中方便地记录各个级别的日志,它的日志文件能够根据不同的规则进行命名以及归档。</p>    <p><img src="https://simg.open-open.com/show/3ce13c0bdb22ba0b4f68b77499ae3264.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="735" height="99"></p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>org.apache.logging.log4j</groupId>      <artifactId>log4j-core</artifactId>      <version>2.5</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4958197497516372389">Logback</a></p>    <p>Logback比Log4j更新,它被视为是log4j的一个替代者。它比log4j的性能更好,而且更完整地实现了SLF4J的接口,并且自带了更多的功能,比如自动压缩日志,更多的filter等。</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>ch.qos.logback</groupId>      <artifactId>logback-core</artifactId>      <version>1.1.7</version>  </dependency></code></pre>    <h2>JSON</h2>    <p>JSON已经成为最广泛使用的一种数据传输格式,因此程序中对JSON的处理也正变得越来越多。下面是我推荐的一些JSON处理库:</p>    <p><a href="/misc/goto?guid=4958860114230125483">Jackson</a></p>    <p>Jackson是一个多用途的Java库,用于处理JSON数据。使用它可以很方便地在JSON数据和Java对象之间进行转换。(<a href="/misc/goto?guid=4958972548552334560">GitHub上的代码库</a>)</p>    <pre>  <code>   ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally     User user = mapper.readValue(new File("user.json"), User.class);</code></pre>    <p><a href="/misc/goto?guid=4958964956010997959">Google Gson</a></p>    <p>Google开发的JSON库,可以实现JSON字符串与JAVA对象之间的转换,使用起来也非常方便。</p>    <pre>  <code>   Gson gson = new Gson();     String[] strings = {"abc", "def", "ghi"};     gson.toJson(strings);  // ==> ["abc", "def", "ghi"]</code></pre>    <h2>图表</h2>    <p><a href="/misc/goto?guid=4958201349754676817">JFreeChart</a></p>    <p>能够为你生成各种类型的图表,并且支持多种输出格式,包括PNG和JPEG图片格式,以及向PDF,EPS,SVG等矢量图。</p>    <p><img src="https://simg.open-open.com/show/2add7804fd1e70f3d2e958debbc15b5a.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="758" height="111"></p>    <p><a href="/misc/goto?guid=4958830897653006229">JasperReports</a></p>    <p>JasperReports提供了一套完整的报表解决方案,帮助用户使用用Java语言来开发具有报告功能的程序。JasperReports的模版采用XML格式,从数据库中抽取数据,并以PDF、HTML、XLS、CSV及XML等各种格式生成报表。它的一大优势是能够处理大数据量的报表。</p>    <p><img src="https://simg.open-open.com/show/3b0f8112999091016e6bcb53acb8557f.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="803" height="333"></p>    <h2>测试</h2>    <p><a href="/misc/goto?guid=4959670563914923239">JUnit</a></p>    <p>JUnit是目前使用最广泛的JAVA单元测试库通过它,你可以i非常方便地编写自己的单元测试代码,并进行自动化测试。(<a href="/misc/goto?guid=4959673040525311293">GitHub上的代码库</a>)</p>    <p><img src="https://simg.open-open.com/show/b6cf6f1379fd43c5bf108e1c79316e0d.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="675" height="202"></p>    <pre>  <code>    @Test      public void lookupEmailAddresses() {          assertThat(new CartoonCharacterEmailLookupService().getResults("looney"), allOf(              not(empty()),              containsInAnyOrder(                  allOf(instanceOf(Map.class), hasEntry("id", "56"), hasEntry("email", "roadrunner@fast.org")),                  allOf(instanceOf(Map.class), hasEntry("id", "76"), hasEntry("email", "wiley@acme.com"))              )          ));      }</code></pre>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.12</version>  </dependency></code></pre>    <h2>Office文档处理</h2>    <p><a href="/misc/goto?guid=4958187983771428385">Apache POI</a></p>    <p>Apache POI是一个免费的开源库用于处理Microsoft Office文档。用它可以使用Java读取和创建,修改MS Excel文件,MS Word和MSPowerPoint文件。(<a href="/misc/goto?guid=4959673040525311293">GitHub上的代码库</a>)</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>org.apache.poi</groupId>      <artifactId>poi</artifactId>      <version>3.14</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4959673040658949196">docx4j</a></p>    <p>docx4j是另一套基于JAXB的Office文档(docx,pptx,xlsx)处理库。(<a href="/misc/goto?guid=4959673040763755126">GitHub上的代码库</a>)</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>org.docx4j</groupId>      <artifactId>docx4j</artifactId>      <version>3.3.0</version>  </dependency></code></pre>    <h2>XML解析</h2>    <p><a href="/misc/goto?guid=4959673040853727475">JDOM</a></p>    <p>JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。在 JDOM 中,XML 元素用 Element 表示,XML 属性用 Attribute 表示,XML 文档本身用 Document 表示。因此这些API都非常直观易用。(<a href="/misc/goto?guid=4959673040944527495">GitHub上的代码库</a>)</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>org.jdom</groupId>      <artifactId>jdom</artifactId>      <version>2.0.2</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4959673041043097788">DOM4J</a></p>    <p>DOM4J是一个处理XML的开源框架,它整合了对于XPath,并且完全支持DOM,SAX,JAXP等技术。</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>dom4j</groupId>      <artifactId>dom4j</artifactId>      <version>1.6.1</version>  </dependency></code></pre>    <p><a href="/misc/goto?guid=4959673041136067912">xerces</a></p>    <p>Xerces是一个开放源代码的XML语法分析器。从JDK1.5以后,Xerces就成了JDK的XML默认实现</p>    <p>添加下面的引用,在Maven项目中加入这个库</p>    <pre>  <code><dependency>      <groupId>xerces</groupId>      <artifactId>xercesImpl</artifactId>      <version>2.11.0</version>  </dependency></code></pre>    <h2>其他值得关注的代码库</h2>    <p><a href="/misc/goto?guid=4959673041225278559">jSOUP</a></p>    <p>jSOUP提供了一套与外部互联网的网页(HTML)进行交互的API,能够让使用者非常方便地 利用CSS选择器来解析HTML页面,从而获取需要的内容。</p>    <pre>  <code>Document doc = Jsoup.connect("http://en.wikipedia.org/").get();  Elements newsHeadlines = doc.select("#mp-itn b a");</code></pre>    <p><a href="/misc/goto?guid=4958988011540898558">Lomobok</a></p>    <p>Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在IDE中加入Lombok,开发人员可以节省构建诸如 hashCode()和equals()这样的方法以及以往用来分类各种 accessor 和 mutator 的大量时间。</p>    <p><img src="https://simg.open-open.com/show/00405bb28eb42571111ded7135500677.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="763" height="477"></p>    <p><a href="/misc/goto?guid=4958545040601117512">Netty</a></p>    <p>Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。</p>    <p><img src="https://simg.open-open.com/show/5de2eb3362762c2abf11dc6b13af7bd1.png" alt="2016年JAVA程序员一定需要知道的优秀第三方库" width="786" height="157"></p>    <p>如果你发现有其他优秀的第三方库,也请在下面的评论中分享,我会继续完善这份清单,使它更具参考价值^_^</p>    <blockquote>     <p> </p>    </blockquote>    <p><a href="/misc/goto?guid=4959673041377573843">文/技匠</a>(简书)<br>  </p>