作者:张龙等,(美)Alex Bretet(亚历克斯 布雷特)
出版社:电子工业出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
SpringMVC实战试读:
前言
欢迎阅读这本独一无二的《Spring MVC实战》,希望你已经为本书的探索之旅做好了准备,本书会带你畅游现代Spring Web开发实践。本书作者已经创建了cloudstreetmarket.com网站,这是一个带有社交功能的股票交易平台,本书将会带领你探索网站开发过程的每一步。本书主要内容
1 企业级Spring应用的搭建
本章介绍了业界的一套标准实践,从配置Eclipse IDE以对Java 8、Tomcat 8、GIT与Maven提供更优化的支持,到理解Maven作为一个构建自动化工具以及作为一个依赖管理工具的认识,阅读本章后你将会了解如何在一个坚实的基础上部署Spring框架。
无论一个项目旨在成为一个能够获得丰厚利润的产品,抑或仅仅是一个练习,都是从相同的企业级模式开始的。
本章并不仅仅是开发Cloud Street Market应用的第一个阶段,还为面向企业级Spring应用的开发者提供了大量的标准化实践。
2 使用Spring MVC设计微服务架构
本章内容有些多,介绍了Spring MVC的核心原则,比如请求流与DispatcherServlet的中心角色,还介绍了如何通过与控制器相关的注解来配置Spring MVC控制器与控制器方法处理器。
在微服务架构的搭建过程中,我们在各个模块与Web项目中安装了Spring与Spring MVC,用于构建易于部署且可伸缩的功能性单元。从这个视角来看,我们通过一个Web模块来构建应用,该模块负责提供一个Twitter Bootstrap模板,同时与另一个专门用作REST Web Services的Web模块搭配使用。
本章将介绍如何通过JSTL将模型从控制器传递给JSP视图,以及如何通过AngularJS来设计JavaScript MVC模式。
3 Java持久化与实体
本章介绍了持久化相关的内容。在这个阶段,了解如何在Spring生态圈以及Spring MVC应用中处理持久化数据很有必要。该章将介绍如何在Spring中通过dataSource与entityManagerFactory来配置JPA持久化提供者(Hibernate)。你将学习如何从EJB3实体来构建好处极多的JPA对象关系映射,接下来会学习如何通过Spring Data JPA来查询仓库。
4 为无状态架构构建REST API
本章揭示了如何将Spring MVC作为REST Web Services引擎。我们将会看到框架对此所提供的令人惊叹的支持,只需为抽象的与Web相关的逻辑的方法处理器提供几个注解即可,这样我们就可以将主要精力放在业务上了。这个原则也用在了请求绑定(参数、URL路径与头信息绑定等)与响应编排注解方面,同时在Spring Data的集成支持上也用到了。
本章还介绍了如何创建作为Spring MVC一部分的异常处理器来将预定义的异常类型转换为通用的错误响应。你将学到如何配置内容协商(这是REST APIs的重要内容),最后还将学习如何通过Swagger与Swagger UI来公开并文档化REST端点信息。
5 使用Spring MVC进行认证
本章介绍了如何在控制器与服务层对HTTP BASIC与OAuth2等标准协议配置认证。你将学习与Spring Security相关的几个概念与实践,例如过滤器链、
6 实现HATEOAS
本章介绍了如何将RESTful Spring MVC API更进一步。超媒体驱动的应用为每个单独的请求资源都提供了链接,这些链接反映了相关资源的URL。它们向客户端(无论是何种类型的客户端)提供了实时的导航选择——精确的文档,同时也是实际的实现。该章将会介绍如何通过JPA实体关联或控制器层来构建这种链接。
7 开发CRUD操作与校验
本章介绍更加高级的Spring MVC概念,通过认识支持交互式HTTP方法(PUT、POST与DELETE)的工具与技术,我们将学习如何使用HTTP1/1规范(RFC 7231语义与内容)来返回恰当的响应状态码与头信息。
本章通过Spring Validator与ValidationUtils辅助类的搭配使用来提供与验证相关的JSR-303和JSR-349规范的兼容实现。该章的最后一节将会介绍消息与内容的国际化(I18N)。我们还通过AngularJS提供了一个客户端实现,使用了已发布的国际化Web Services。
8 通过WebSocket与STOMP进行通信
本章将会聚焦于“冉冉升起”的WebSocket技术,并为我们的应用构建面向消息的中间件。该章提供了一个大家很少会见到的示例,通过Spring实现了关于WebSockets的大部分内容,从默认的嵌入式WebSocket消息代理的使用,到特性完备的外部代理(借助于STOMP与AMQP协议)。我们将会了解如何向多个客户端广播消息,以及如何通过优秀的可伸缩特性推迟耗时任务的执行。
通过本章你还将学到如何动态创建私有队列,以及如何获取认证客户端并通过这些私有队列与其收发消息。
为了实现WebSocket认证与消息认证,我们将API置为有状态的。对于有状态来说,我们要知道的是API将会使用HTTP会话在多个请求间保持用户的认证状态。借助于Spring Session与高度集群化的Redis服务器的支持,会话将可以在多个Web应用间共享。
9 测试与故障排除
本章介绍了一套用于维护、调试与改进应用状态的工具与一般做法。作为本书的最后一部分内容,我们将会学习如何通过Flyway Maven Plugin将数据库模式从一个应用版本升级为另一个,并将其作为Maven构建的一部分。我们还会学习如何编写自动化单元测试(借助于Maven Surefire与Mockito)与集成测试(使用一套库,例如Cargo、Rest-assured与Maven Failsafe)。
该章的最后一节介绍了将Log4j2作为全局日志框架的做法,无论什么环境,我们都可以通过这一日志解决方案来高效排错。阅读本书之前的准备工作
书中多个章节都列出了系统需要具备的硬件与软件条件。而且,学习本书经常需要访问互联网资源,有不少扩展内容都给出了链接,或者需要下载必备软件。
此外更加重要的是,本书使用Git版本系统来管理每章的代码基,本地的Git仓库需要对应于项目的远程仓库(位于GitHub上),要能够访问这个远程仓库。
本书的示例支持三种操作系统:MS Windows、Linux与Mac OS X。
对于硬件平台,推荐使用主流、高性能的工作站,最低2 GB内存,500 MB以上空闲硬盘空间。本书面向的读者
在编写本书时,作者的一个目标就是一方面尽量保持内容的可读性,另一方面则尽量多地向读者介绍现代Web开发的实践。
我们相信,对Spring MVC感兴趣的大多数读者的主要目的在于寻求一个入门套件和工具箱,来开发现代、基于Spring的Web应用。我们还相信,大多数读者都倾向于通过实践而非理论来强化对概念的理解。当下,我们都知道人们具有不同的学习习惯与方式。
鉴于此,本书的各个章节都是逐步推进的,从直观的第1章到更具挑战性的第8章。相比后面的章节来说,前几章更适合大多数Java开发者。
话虽如此,本书却几乎包含了你所要的一切!本书配套的示例应用已经处于运行状态,等待着你的探索,理解其工作方式。
一般来说,我们假定你是一名具有Web开发经验的Java开发者。此外,我们期望你对学习Spring Web技术拥有浓厚的兴趣。本书各章结构
本书各章都包含多个主题,各个主题的展现结构相似,如下所示。准备
这一小节介绍了要实现的功能,并描述了如何安装所需的软件或配置其他初始设置。实现
这一小节包含了完成操作所需的各个步骤。说明
这一小节通常会对上一部分介绍的操作步骤进行详尽解读。扩展
这一小节包含了当前主题的一些相关信息,旨在让读者有更加深刻的认识。其他
这一小节针对当前主题提供了一些有价值的信息链接。本书约定
你会在书中看到大量用于区分各类信息的文本样式。下面给出一些示例并进行解释说明。
文本中的代码、数据库表名、目录名、文件名、文件扩展名、路径名、用户输入内容等的格式是这样的:“我们会检查cloudstreetmarket-api Web应用的配置变更以便建立类型约定”。
代码段格式如下所示:
</propertY>
Add and Remove...”。
警告信息或重要说明会出现在这样的框中。
提示与技巧的格式是这样的。配套服务
轻松注册成为博文视点社区用户(www.broadview.com.cn),即可享受以下服务。
下载资源”处下载。
提交勘误”处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。
读者评论”处留下您的疑问或观点,与我们和其他读者一同学习交流。
页面入口:http://www.broadview.com.cn/31111
二维码:1 企业级Spring应用的搭建
本章主要内容:● 安装Eclipse JEE开发者版本与Java SE 8● 完成Eclipse的Java SE 8版本,Maven 3及Tomcat 8的配置● 使用Maven定义项目结构● 安装Spring、Spring MVC与Web框架引言
在启动这个开发项目之前,让我们先来思考一些问题,这些问题应该有助于更好地理解这一过程。请记住,本章的内容对接下来的章节能起到抛砖引玉的作用。
来点乐趣吧!
在这本书中,我们来扮演ZipCloud公司这个角色。ZipCloud的目标是针对社交和金融行业开发不同的产品。我们要构建的第一个产品为cloudstreetmarket.com,它是一款具有社交功能的股票交易平台。这个项目对于“幼小”的ZipCloud来说是个很合适的起点!为什么要这样
不管你的初衷是什么,确保设计思想不会被早期阶段的失败所影响是十分必要的。该例程包括如何对抗这种风险的内容。
抛开这个例程的本身,我们是为了共享一个项目启动的引导方法,而这正是取决于你目前和今后的需求。该例程也是让基于产品的构思趋向于可持续构建的关键,从而能够轻松进行重构和维护。
建立一个新的企业级架构项目不会影响你的兴致和创造力!为什么使用Eclipse IDE
即使在这个领域存在竞争关系,但Eclipse仍是一个在Java中流行并且实用的开源解决方案,所以它可以不受限制地在网络上被人访问。并且它还提供了其他用途:为Web应用提供良好的支持,特别是MVC Web应用。为什么使用Maven
Maven是一个软件项目和综合管理工具,是一个由Apache和Apache软件基金会支持的开源项目。近10年来,Maven获得了巨大收益。它还影响了Java项目的标准结构。
项目对象模型(POM)的推动下,它对所有人和潜在的第三方软件提供了解决方案,以一致的方式来理解和构建Java项目层次结构中的所有依赖项。
在初期架构体系中,对以下问题的考虑是至关重要的:● 对潜在的不同开发环境和持续集成工具的公开项目定义;● 监测依赖项并保证它们的访问安全;● 在项目层级中实行统一目录结构;● 构建含有自测组件的自测软件。
选择Maven可以保证这些,并满足我们对项目可重用、安全和可测试(自动化)的需求。Spring框架带来了什么
依赖注入(DI)——原则的核心功能完好地被重复使用。
因为保持轻量,它能够保证高扩展性,并且能够适配所有的现代化架构。安装Eclipse JEE开发者版本与Java SE 8
接下来的步骤有关下载安装Eclipse IDE JEE开发者版本,以及下载安装JDK 8 Oracle Hotspot。准备
这一步对于具有一定技术水平和经验的广大读者来说可能是多余或没必要的,但是,在本书中确立一个统一的配置会带来诸多好处。
例如,可以避免未知的Bug(集成或开发的),可以看到与插图所示相同的界面。此外,因第三方产品一直存在,你将会经常看到不期而至的界面提示或窗口。实现
本章通篇需要一步一步地操作。从下一章开始,我们将使用GIT,这将减轻你的工作量。
1. 下载Eclipse IDE的Java EE开发者版本。● 在这本书中,我们将使用Eclipse Luna版本。建议安装此版本来
全面匹配书中的指引和插图。可以访问https://www.eclipse.org/
downloads/packages/eclipse-ide-java-ee-developers/lunasr1根据
实际操作环境选择合适的Luna版本下载。
下载得到的文件是一个Zip压缩包,而不是已编译的安装程序。● 如果你觉得有足够的信心去使用另一个版本的(较新)Eclipse
IDE的Java EE开发者版本,都可以在https://www.eclipse.org/
downloads找到。
在Windows系统中,对于接下来的安装操作,建议安装在根目录下(C:\)。为了避免有关权限的问题,将你的Windows用户配置设置为本地管理员会更好。如果不在管理员组中,具有对安装目录的写访问权限也可以。
2. 将下载的文档解压到eclipse目录。● C:\Users\{system.username}\eclipse:如果是Windows系统,解
压到这个路径。● /home/usr/{system.username}/eclipse:如果是Linux系统,解压
到这个路径。● /Users/{system.username}/eclipse:如果是Mac OS系统,解压到
这个路径。
3. 选择并下载JDK 8。● 建议下载Oracle Hotspot JDK。Hotspot是一个最初由Sun
Microsystems构建的高性能JVM实现,如今归属于Oracle公司。
Hotspot JRE和JDK都是免费下载的。● 然后,选择与所用计算机对应的Oracle产品,网站链接为http://
www.oracle.com/technetwork/java/javase/downloads/jdk8-
downloads-2133151.html。
为避免以后出现兼容性问题,需要与之前为Eclipse选择的操作系统位数(32位或64位)保持一致。
4. 根据以下指南,在操作系统中安装JDK 8。
在Windows中,这将是一个由可执行文件启动的可监控安装:
1) 下载文件并等待,直至进入下一个安装步骤。
2) 在安装界面中,注意安装文件夹目录,并将其更改为C:\java\jdk1.8.X_XX(此处的X_XX指的是当前的最新版本。在本书中,以jdk1.8.0_25为例进行讲解。此外,它不需要安装一个外部的JRE,所以取消选中公共JRE功能)。
在Linux/Mac中,执行以下操作:
1) 下载与安装环境相符的tar.gz文档。
2) 将当前目录更改为要安装Java的路径。简单来说,选择/usr/java目录。
3) 将下载的tar.gz文档移至该目录。
4) 用下面的命令解压缩文件,tar zxvf jdk-8u25-linux-i586.tar.gz(此处以用于Linux x86机器的二进制包为例)。
注意,必须以包含/bin,/db,/jre和/include子目录的/usr/java/jdk1.8.0_25目录结构结束。说明
在这一节我们要深入了解所用的Eclipse版本以及如何选择这个特定版本的JVM。
Eclipse Java EE开发者版本
我们已经成功地安装了Eclipse IDE的Java EE开发者版本。相对于Eclipse IDE的Java开发者版本来说,它有一些额外的软件包,例如Java EE Developer Tools、Data Tools Platform和JavaScript Development Tools。这个版本备受推崇在于能够将管理开发服务器作为IDE本身的一部分、自定义项目结构与支持JPA的能力。Luna是Java SE 8官方兼容版本,这在编写本书时是一个决定性的因素。
选择一个JVM
关于JVM实现的选择,在性能、内存管理、垃圾回收和优化功能等方面有许多能够讨论的话题。
目前存在很多不同的JVM实现,包括几个开源解决方案,如OpenJDK和IcedTea(RedHat)。JVM的选择取决于应用程序的需求。我们根据经验和参考实现部署层面选择了Oracle Hotspot,这个JVM实现应用广泛并可以信任。如果你要运行Java UI应用程序,Hotspot也会表现得很好。Eclipse就是其中之一。
Java SE 8
如果你还没用过Scala或Clojure,这是你开始着手Java函数编程训练的绝佳时刻!使用Java SE 8,Lambda表达式可以减少代码量,大大改进可读性和可维护性。我们不会执行这个Java 8功能,但因其受欢迎程度,它必须强调大规模的范式转变。现在,最重要的是要熟悉这些模式。为Eclipse配置Java 8、Maven 3和Tomcat 8
这个过程包括在Eclipse上对Java,Maven和Tomcat进行有效的开发配置。准备
一旦安装了不同的产品,有几个步骤我们需要遵循,主要是让Eclipse与Java SE 8, Maven 3和Tomcat 8一起正常工作。在这个过程中,我们也将看看如何定制Eclipse配置文件(Eclipse.ini)以最大限度地发挥Java平台的作用,并确保它将应付任何应用程序的显著增长。实现
在系统桌面上对Eclipse进行配置的步骤如下:
1. 可以通过在桌面上创建一个快捷方式,以指向Eclipse可执行文件。● 在Windows上的可执行文件是Eclipse.exe,它位于eclipse目录的
根目录。● 在Linux/Mac上的文件是Eclipse,也是位于eclipse目录的根目
录。
2. 然后,我们需要自定义eclipse.ini文件。
在之前解压得到的Eclipse目录中,可以找到eclipse.ini文件。它
是一个文本文件,包含了一些控制Eclipse启动的命令行选项。● Eclipse社区建议在这里指定我们的JVM的路径。因此,根据所用
的操作系统,在文件开头部分添加以下两行代码。
对于Windows,添加以下内容: -vm C:\java\jdk1.8.0_25\jre\bin\server\jvm.dll
对于Linux/Mac,添加以下内容: -vm /usr/java/jdk1.8.0_25/jre/lib/{your.architecture}/server/libjvm.so
可以考虑下面所列的可选设置:● 如果用于开发的机器具有至少2 GB的RAM,可以输入以下代
码,从而让Eclipse比默认设置跑得更快。这部分是可选的,因
为Eclipse的默认设置已经优化为适合大多数用户环境。 -vmargs -Xms128m -Xmx512m -Xverify:none -Dosgi.requiredJavaVersion=1.6 -XX:MaxGCPauseMillis=10 -XX:MaxHeapFreeRatio=70 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing
如果所用的机器配有小于2GB的RAM,抛开重写默认的Xms和-
Xmx参数,仍然可以输入这些可选项。
JVM启动时,-Vmargs参数下的所有选项都将传递给它。不要和Eclipse选项(文件开始部分)与VM参数(文件后面部分)弄混淆了,这十分重要。
3. 接下来,通过以下步骤来启动Eclipse并设置工作区。
启动在步骤2中提到的可执行文件。● 对于本书的项目,指定路径:
对于不同的操作系统,路径有所不同:● C:\Users\{system.username}\workspace:这是在Windows上的路
径。● /home/usr/{system.username}/workspace:这是在Linux上的路径。● /Users/{system.username}/workspace:这是在Mac OS上的路
径。● 单击OK按钮,让Eclipse程序启动。
工作区是管理Java项目的地方,可以是一个特定的应用程序,但不是必需的。
4. 检查JRE定义。
在这里,几个设置是必须在Eclipse中确认的。
1) 在Window下打开Preferences菜单(在Mac OS X系统中Preferences菜单位于Eclipse菜单下)。
2) 在左侧的导航面板中展开Java栏,并单击Java下的Installed JREs。
3) 在界面中,删除任何已经存在的JREs。
4) 单击Add按钮添加标准的JVM。
5) 输入C:\java\jdk1.8.0_25(或/usr/java/...)作为JRE Home。
6) 输入jdk1.8.0_25作为JRE name。
我们告诉Eclipse使用JDK 8的Java运行环境。
完成这些步骤之后,配置情况应如下图所示。
5. 现在,我们将检查编译器遵循级别。
1) 在导航窗格中,单击Java下的Compiler。
2) 在下拉列表中确认Compiler compilance level设置为1.8。
6. 在此之后,我们需要检查Maven配置。
Maven | Installations。
2) 我们将在此处指定计划使用的Maven。基于本书的目的,理想的选择是内置的Maven。
3) 回到在导航面板中,选择Maven | User Settings。
4) 设置本地资源库为
在本地资源库中,本地缓存的所需文件的版本将驻留。这将避免我们在每次构建中去下载它们。
5) 对于User Settings字段,在.m2中创建一个settings.xml文件,目录为
6) 编辑settings.xml文件并添加以下内容(也可以从本书配套文件的chapter_1/source_code/.m2目录复制并粘贴)。
如果你不是在Windows机器上,更改文件中的JAVA_HOME为实际的JDK安装目录(/usr/java/jdk1.8.0_25)。
7) 回到导航面板,单击Maven选项,配置情况如下图所示。
8) 单击OK按钮,保存这些配置更改。
7. 现在,我们将在Eclipse IDE中安装Tomcat 8,步骤如下所述。
1) 从Tomcat网站下载最新的核心版本Tomcat 8 ZIP包(http://tomcat.apache. org/download-80.cgi)。
2) 将所下载文件解压缩到以下目录。● 在Windows上,将其解压缩至C:\tomcat8。● 在Linux上,将其解压缩至/home/usr/{system.username}/
tomcat8。● 在Mac OS X上,将其解压缩至/Users/{system.username}/
tomcat8。
根据所用的系统,必须能够从文件系统中找到bin目录:C:\tomcat8\bin、/home/usr/{system.username}/tomcat8/bin或/Users/{system. username}/tomcat8/bin。
3) 在Eclipse中,选择Window菜单下的Preferences子菜单,并在左边的导航面板中展开Server选项,然后选择Runtime Environments。
4) 在窗口中单击Add按钮。
5) 在下一步中(New Server环境窗口),导航到Apache | Apache Tomcat v8.0。
6) 选中此选项:Create a New Local Server。
7) 单击Next按钮。
8) 参照下图在相应栏中填写信息。
如果使用的是Linux(或Mac OS X),用实际的Tomcat安装目录替换C:\tomcat8。说明
本节中,我们来回顾一下所学的各个要素和概念。
Eclipse.ini文件
我们已经知道,eclipse.ini文件控制Eclipse的启动,它是一个额外的使Eclipse平台高度可配置的组件。官方文档中给出了能够使用的命令行参数列表(http://help.eclipse.org/luna/topic/org.eclipse.platform.doc.isv/reference/misc/runtime-options.html)。
该文档中提及的以下警告信息需要重点注意。● -vmargs之后的所有行都被作为参数传递给JVM;Eclipse的所有
参数和选项必须在-vmargs之前指定(正如在命令行上使用参数
一样)。
这就是为什么要在文件的开始处插入-vm选项的原因。● 在命令行中使用-vmargs将覆盖所有在.ini文件中的-vmargs设
置,除非在.ini文件中或命令行中指定了--
auncher.appendVmargs。
设置 - vm选项
设置-vm选项用于确定Eclipse使用哪个JVM实现。你可能会注意到我们已经选定了JVM作为一个库(*.dll /*.so),这在启动时能提供更好的性能,还支持程序作为Eclipse可执行文件运行而并不只是作为Java可执行文件。
如果想知道在没有设置-vm选项时Eclipse使用哪个JVM,请注意Eclipse不查询JAVA_HOME环境变量(Eclipse wiki)。相反,Eclipse执行解析path环境变量的Java命令。
自定义JVM参数
推荐的JVM参数列表来自于Piotr Gabryanczyk在Java内存管理模型方面的研究成果。最初用于JetBRAINS Intellij设置,这种配置对Eclipse环境也是有用的。在以下场合中有帮助:● 防止垃圾回收器中断程序的运行超过10 ms(-
XX:MaxGCPauseMillis = 10)。● 降低垃圾回收器启动的级别到30%的所占用内存(-
XX:MaxHeapFreeRatio = 70)。● 强制垃圾回收器作为一个并行线程运行,降低对应用程序的干扰(-XX: + UseCon-cMarkSweepGC)。● 为垃圾回收器选择增量模式,可以在GC工作中生成中断让应用
程序明确地停止冻结(-XX: + CMSIncrementalPacing)。
在整个程序的生命周期中,实例化的对象存储在堆内存中。该建议参数定义了128MB的JVM启动堆空间(-Xms),以及512MB的最大堆空间(-Xmx)。堆被分为两个子空间,如下所述。● 新生代:新对象都存储在这个区域。对于Hotspot或OpenJDK
JVM,新生代的内存空间分为两个部分。● Eden:新对象存储在这一细分领域,短暂存活的对象将被从这
里释放。● Survivor:这是新生代和老生代之间的缓冲区。Survivor空间小于
Eden,也被分成了两半(FROM和TO区域)。可以通过-XX:
SurvivorRatio调整Eden与Sur-vivor对象的比例(-XX:
SurvivorRatio = 10意味着Young = 12,Eden=10, From=1,
To=1)。
新生代区域的最小值可以通过-XX: NewSize调整,最大值可以通过-XX: MaxNewSize调整。● 老生代:当Eden或Survivor空间中的对象经过足够多的垃圾收集
后仍被引用时,它们将被移动到这里。可以通过-XX: NewRatio
设置新生代区域大小与老生代区域大小的比例。(-XX: NewRatio
= 2意味着HEAP = 3,YOUNG = 1,OLD = 2。)
新生代空间的最大值-XX: MaxNewSize必须始终小于堆空间的一半(-Xmx/2),因为垃圾回收器可能会把所有新生代空间移入老生代空间。
对于Hotspot或OpenJDK,永生代空间用来存储有关类的定义信息(结构、字段、方法,等等)。当加载的结构变得太大时,你可能会遇到PermGen space OutOfMemortError异常。对于这种情况,解决办法是增加-XX: MaxPermSize参数,JDK8则不需要。
永生代(PermGen)空间已被一个不属于堆而是本地内存的元数据空间取代,这个空间的默认最大值是无限的。不过,我们仍然可以使用-XX: MetaspaceSize或-XX: Max-MetaspaceSize来限制它。
更改JDK编译级别
降低编译级别允许我们运行一个比原先定义JDK版本要低的Java编译器,这影响到Eclipse构建、错误和警告,以及JavaDoc。显然不可能设置成比原先的编译器版本更高。
配置Maven
在Eclipse中,大部分的Maven配置来自m2eclipse插件(也被称为Eclipse Maven集成)。Eclipse Luna默认包括这个插件,不需要手动下载。通过配置Maven,m2eclipse对于从IDE上下文触发Maven操作是很有用的,并且为创建Java Maven项目提供帮助。下一节将会学习关于m2eclipse的更多内容。
接下来安装基本的settings.xml文件。这个文件用于配置没有被直接绑定到任何项目的Maven。settings.xml的最常见用途可能是属性定义和访问仓库的凭据存储。
通过Maven配置文件,可以构建特定的环境、匹配特定的配置(变量值、依赖集等)。Maven配置文件可以互相累加,可以通过命令行、Maven设置中的声明、环境配置(包括文件系统中存在或缺少的文件、使用的JDK等)来激活。
在settings.xml文件中,我们通过自己的JAVA_HOME属性定义了编译器配置。默认情况下,在
仓库管理器
仓库管理器是一个第三方应用,用来管理项目开发中可能需要的所有二进制文件和依赖关系。作为开发环境和公共仓库之间的缓冲代理,仓库管理器用于实现对关键参数的控制,例如构建时间、依赖可用性、可见性和访问限制,等等。
著名的解决方案包括Apache Archiva、Artifactory、Sonatype Nexus。在我们应用程序中没有使用仓库管理器。
Eclipse内置的Tomcat 8
JEE开发者的Eclipse允许在开发环境中集成Tomcat和其他应用服务器。通过提供的Web工具平台(WTP)插件,可以管理Web项目的构建、编译以及部署到Web服务器。
在Servers选项卡(先将其设置为可见状态)中,双击创建的Tomcat v8.0服务器,打开一个配置窗口,配置通常定义在Tomcat文件server.xml(位于tomcat8\conf目录)中的参数。
Publish module contexts to separate XML files选项来改变。扩展● 了解更多关于Eclipse安装的信息,请访问http://wiki.eclipse.org/
Eclipse/Installation。● 了解更多关于Eclipse.ini文件的信息,请访问http://
wiki.eclipse.org/Eclipse.ini。● 了解更多关于m2eclipse插件的信息,请访问https://
maven.apache.org/plugins/maven-eclipse-plugin/。● 了解如何使用仓库管理器,请参阅http://maven.apache.org/
repository-manage-ment.html。● 查阅Piotr Gabryanczyk关于IDE垃圾回收优化的文章,可以访问
http://piotrga.wordpress.com/2006/12/12/intellij-andgarbage-
collection。● 了解更多关于内存优化的信息,请访问http://pubs.vmware.com/
vfabric52/top-ic/com.vmware.vfabric.em4j.1.2/em4j/conf-heap-
management.html和https://blog.codecentric.de/en/2012/08/useful-
jvm-flags-part-5-young-generation-garbage-collection。定义Maven的项目结构
在本节中,将重点讨论如何定义应用程序所需要的Maven项目结构。准备
一开始,我们将创建两个Eclipse项目:一个用于应用程序,一个用于ZipCloud公司以后跟其他项目分享的组件。下面的插图介绍了我们将要构建的项目组件。
jar依赖项(cloudstreetmarket-core)。
jar。实现
通过以下步骤可以创建一个Maven父项目:
File | New | Other菜单项。
Next按钮。打开的New Maven Project向导界面如下图所示。
Next按钮。
4. 按照下面的提示填写向导选项。● Group Id:edu.zipcloud.cloudstreetmarket● Artifact Id:cloudstreetmarket-parent● Version:0.0.1-SNAPSHOT● Packging:pom● Name:CloudStreetMarket parent
然后,单击Finish按钮。
父项目必须显示在左侧窗格的包资源管理器中,如下图所示。
现在需要告知m2eclipse打算在这个项目中使用的Java编译器版
本,让它自动添加正确的JRE系统库到将要创建的子项目中。这
需要通过pom.xml文件完成。
5. 编辑pom.xml文件来指定Java编译器版本。● 双击pom.xml文件,默认显示m2eclipse Overview选项卡,需要
单击最后一个选项卡pom.xml来查看完整的XML定义。● 在这个定义中,在结尾处添加下面的内容,但仍然作为
段的一部分。(也可以从本案例的配套源代码中复制代码,在
chapter_1文件夹中查找pom.xml文件。)
maven-surefire-plugin声明。我们会很快回顾它,它使我们能够在生成过程中运行单元测试。
6. 现在,我们将创建子模块。
作为父项目的子模块,需要一个Web模块处理和呈现站点、一个
Web模块用于REST API,以及一个用于包装所有业务逻辑(服
务、数据访问等)的模块。对于第一个产品
cloudstreetmarket.com,进行如下操作。
1) 从Web应用的主模块开始:在Eclipse中,选择File | New | Other菜单项。打开可以选择项目类型的New向导,打开Maven类别,选择Maven Module,并单击Next按钮。
2) 打开New Maven Module向导,根据以下提示进行设置。 选中Create a simple project复选项。 在Module Name框中输入cloudstreetmarket-webapp。 在Parent Project框中输入cloudstreetmarket-parent。
3) 单击Next按钮。在出现的新窗口中输入以下信息。 Group Id:edu.zipcloud.cloudstreetmarket Version:0.0.1-SNAPSHOT Packaging:war Name:CloudStreetMarket Webapp 然后单击Finish按钮。
7. 继续创建REST API模块。我们使用不同的参数重复以前的操作。
1) 在Eclipse中,选择File | New | Other菜单项,弹出的选择向导。然后,打开Maven类别,选择Maven Module,并单击Next按钮。
2) 在New Maven Module向导中,进行如下操作。 选中Create a simple project复选项。 在Module Name框中输入cloudstreetmarket-api。 在Parent Project框中输入cloudstreetmarket-parent。
3) 单击Next按钮继续下一步,在窗口输入以下内容。 Group Id:edu.zipcloud.cloudstreetmarket Version:0.0.1-SNAPSHOT Packaging:war Name:CloudStreetMarket API 然后单击Finish按钮。
8. 创建核心模块。
为此,选择File | New | Other菜单项。弹出窗口后,打开Maven
类别,选择Maven Module,并单击Next按钮。
1) 在New Maven Module向导中,进行如下操作。 选中Create a simple project复选项。 在Module Name框中输入cloudstreetmarket-core。 在Parent Project框中输入cloudstreetmarket-parent。
2) 单击Next按钮转到下一步,填写如下信息。 Group Id:edu.zipcloud.cloudstreetmarket Version:0.0.1-SNAPSHOT Packaging:jar Name:CloudStreetMarket Core 然后单击Finish按钮。
如果Java视图已经激活(在右上角),整体创建结构应该如下图
所示。
9. 创建公司特定项目及其模块。
假设以后公司业务项目中会有许多不同类别的依赖关系(核心、
消息、报告等)。
1) 我们需要一个父项目,因此在Eclipse中选择File | New | Other菜单项,弹出选择向导窗口。展开Maven选项,选择Maven Project,单击Next按钮。
2) 在New Maven Project向导的第一步中,仅选中Create a simple Project和Use default workspace location选项。
3) 单击Next按钮,并按如下提示进行设置。 在Group Id框中输入edu.zipcloud。 在Artifact Id框中输入zipcloud -parent。 在Version框中输入0.0.1-SNAPSHOT。 设置Packaging选项为pom。 在Name框中输入ZipCloud Business Parent。
另外,在创建的pom.xml文件中,添加下面的内容到
来创建基础模块属性并启用自动测试。(也可以从本书配套的
chapter_1源代码文件pom.xml中复制这段代码。)
试读结束[说明:试读内容隐藏了图片]