文档章节

构建Gradle范例项目之构建web项目

柳哥
 柳哥
发布于 2015/10/26 19:28
字数 1386
阅读 555
收藏 3

Gradle提供了开箱即用的插件,用来组装WAR文件和将web应用部署到本地Servlet容器中。Gradle对构建和运行web应用都提供了扩展性支持。这里我们学习使用两个web应用程序部署插件:WarJettyWar插件扩展自Java插件,为web应用部署和组装War包添加了约定和支持。Jetty是一个流行的轻量级开源web容器,它通过将一个HTTP模块添加到应用中来提供一个嵌入式实现。Gradle的Jetty插件扩展了War插件,为部署一个web应用到嵌入式容器和运行web应用提供了对应的任务。

War插件

我们之前提到过War插件扩展自Java插件。实际上,这意味着你不需要在构建脚本中应用Java插件。它会自动由War插件引入不过即便你也应用了Java插件,这也不会对你的项目带来其他影响。应用插件是一个幂等操作,因为某一个指定的插件只会执行一次。当创建build.gradle文件中,使用插件只需要像这样:

apply plugin: 'war'

web应用默认约定的源代码目录是 src/main/webapp

另外,实现web应用所需要的类不可能完全是java标准api,很多可能是第三方库里的api。在运行构建之前,你需要确保声明了外部依赖。War插件引入了两个新的依赖配置项。例如,Servlet依赖使用到的配置项是 providedCompile。它表示该依赖在编译时需要,但是运行时由环境提供。这里的运行时环境是Jetty,tomcat这样的Servlet容器。结果就是,被标记为providedCompile的依赖不会打包到WAR文件中。像JSTL库这样的依赖,在编译时不需要,但是运行时需要。它就要声明为runtime,它就会成为WAR文件的一部分。示例:

dependencies {
    providedCompile 'javax.servlet.servlet-api:2.5'
    runtime 'javax.servlet:jstl:1.1.2'
}

构建项目

在Gradle中构建一个web应用就和构建一个独立运行的Java应用程序一样。运行:

$ gradle build

命令后,组装的WAR文件可以在 build/libs 目录下找到。

War插件确保组装的WAR文件遵循由Java EE规范定义的标准结构。war任务将web应用源代码目录 src/main/webapp 的内容原封不动地拷贝到WAR文件的根目录。编译的class文件最终会放置在 WEB-INF/classes 下,通过依赖闭包定义的运行时类库会放置在 WEB-INF/lib 下。注:默认情况下,WAR文件的名字会继承自项目的目录名字。

定制War插件

即便你的项目没有遵循Gradle的标准约定,该插件也依然可以构建WAR文件。假设所有的静态文件都放置在static目录下(例如:css,js,jmg),而且所有web应用的内容都放置在webfiles目录下(如:jsp,web.xml)。

下面的代码片段显示了如何配置约定属性。War插件暴露了 webAppDirName 约定属性,默认值是 src/main/webapp,重新赋值就可以轻松地切换到webfiles。通过触发from方法就可以有选择性地将需要的目录添加到WAR文件中,如下:

webAppDirName = "webfiles'        //改变web应用的源代码目录
war {
    from 'static'                 //将静态资源文件的目录(js目录,css目录等)添加到WAR文件的根目录 
}

之前的例子仅仅显示了War插件配置选项的一部分。如果你要找某个配置参数,那么查看War插件的DSL指南是第一选择。

在嵌入式web容器中运行

现在我们来将文件部署到Servlet容器(Jetty)中。因为War插件暴露了所有的信息,Jetty插件可以在运行时访问它们。这是Gradle中一个典型的例子,通过Gradle的API,一个插件可以访问另一个插件的配置。在你的构建脚本中,像这样使用插件:

apply plugin: 'jetty'

运行web应用使用的任务是 jettyRun 。即使没有WAR文件,它也会启动Jetty容器:

$ gradle jettyRun

在输出结果的最后一行,插件告诉你Jetty所监听的请求URL。Gradle会一直让应用程序运行,直接你按“Ctrl + C”键。Jetty是如何知道在什么端口和上下文中运行应用的呢?还是约定。Jetty插件运行一个web应用的默认端口8080 。上下文路径 abc 是从项目名字继承的。当然,这些都是可配置的

:每次改变项目代码都需要重新启动容器是非常麻烦和耗时的。Jetty插件允许你在不重启容器的情况下,改变静态资源和JSP文件。另外,还针对class文件的改变配置像Jrebel这样的字节码交换技术来执行热部署

定制Jetty插件

假设你不满意Jetty插件提供的默认值。比如,已经有一个应用使用了8080端口,而且你也讨厌输入那么长的上下文路径。下面的配置可以解决你的问题 :

jettyRun {
    httpPort = 9090
    contextPath = 'a'
}

用这个配置启动应用,将暴露:http://localhost:9090/a 。Jetty插件还提供了更多的配置选项,查看插件的API文档是最好的选择。

 

© 著作权归作者所有

柳哥
粉丝 207
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
构建Gradle范例项目之Gradle包装器

你做好web应用的原型,向你的同事展示,他们说想要加入你的开发团队,给你的应用添加更多的高级特性让它更上一层。代码已经被提交到版本控制系统中,所以他们把代码下载下来就可以开始工作了...

柳哥
2015/10/26
432
0
构建Gradle范例项目之构建Java项目

Gradle插件通过引入特定领域的约定和任务来构建你的项目。Java插件是Gradle自身装载的一个插件。Java插件提供的基本功能远比源代码编译和打包多。它为你的项目建立了一个标准的项目布局,并确...

柳哥
2015/10/21
1K
0
Gradle——创建简单的项目

项目 & 任务 Gradle 的一切都是基于项目和任务的。 构建由一个或多个项目组成。项目的概念很抽象,它取决于你要用Gradle 做什么 。项目可以是 一个 Jar 库或者一个 web 程序。也可以是一个 ...

佛系编码
08/04
0
0
Gradle学习(一)——简介

基础 依赖管理是基于apache Ivy的,任务和构建是基于ant的,脚本是用groovy的,如果你之前已经非常了解这三样的话,那么你已经学会了30% 优点 比之前的构建系统更优的有几点: 1. 更为强大的...

lastsweetop
2017/12/19
0
0
Gradle入门(6):创建Web应用项目

本文由 伯乐在线 - JustinWu翻译,黄利民 校稿。未经许可,禁止转载!英文出处:Petri Kainulainen。欢迎加入翻译组。 如果你并不熟悉Gradle,在继续阅读本文之前,你应当先阅读以下文章。 ...

低至一折起
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
55分钟前
3
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
5
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部