使用Gradle构建Java Web应用(译)

标签: gradle java web | 发表时间:2014-01-23 13:22 | 作者:Sha Jiang
出处:http://www.blogjava.net/
使用Gradle构建Java Web应用
本文是发布在 java.net上的一篇摘自于<Gradle in Action>一书中的 节选,介绍了使用 Gradle构建Java Web应用的过程。刚刚接触Gradle,看到了这篇小文,随手译了出来:-) (2014.01.23最后更新)

当今世界,一派繁忙。在职业生涯和私人生活中,我们中间的许多人要同时管理多个项目。你可能常常发现自己处于不知所措及失控的状态。保持规整并专注于价值的关键是一个维护良好的工作清单。当然,你可能总是把你的任务写在一张纸上,但是你也许不可能在你所处的任何地方都可方便地获得这些工作条目?对互联网的访问几乎是无处不在的,无论是通过你的移动电话,还是公共的网络接入点。在<Gradle in Action>一书中,如图1所示的说明性示例是一个很有吸引力的可视化Web应用。

图1 To Do应用可以通过互联网进行访问,并使用它去管理数据存储中的工作条目

Gradle插件表现的如同一个使能器,它会自动地执行这些任务。一个插件通过引入特定领域的规范以及对缺省值敏感的任务去对工程进行扩展。随Gradle发布的插件之一就是Java插件。该Java插件绝不仅仅是提供了源码编译和打包这样的基础功能。它为工程建立了一整套标准的目录布局,它会确保以正确的顺序去执行任务,这样,这些任务在Java工程环境中才是有意义的。现在是时候为我们的应用去创建一个构建脚本并去使用这个Java插件了。

构建Java应用
一开始,每个Gradle工程都会创建一个名为build.gradle的构建脚本。为了创建该脚本,并告诉该工程使用Java插件,应该像这样去做:
apply plugin: 'java'
为了构建你的Java代码,一行代码就够了。但Gradle怎么知道去哪儿找你的源文件呢?该Java插件引入的规范之一就是源代码的路径。默认地,该插件会到目录src/main/java中搜寻产品的源代码。

构建Web应用
通过War插件,Gradle也提供了构建Web应用的扩展支持。War插件扩展了Java插件,它加入了针对Web应用程序开发的规范,并支持归集WAR文件。让我们也在这个工程中用用War插件:
apply plugin: 'war'
Web应用源文件的默认路径是src/main/webapp。假设你已经明确了该应用所必要的Java类。那么要使产品的全部源代码和Web资源文件处于正确路径下,该工程的目录布局应该像下面这样:
.
├── build.gradle
└── src
    └── main
        ├── java
        │   └── com
        │       └── manning
        │           └── gia
        │               └── todo
        │                   ├── model
        │                   │   └── ToDoItem.java
        │                   ├── repository
        │                   │   ├── InMemoryToDoRepository.java
        │                   │   └── ToDoRepository.java
        │                   └── web
        │                       └── ToDoServlet.java
        └── webapp                                               #A
            ├── WEB-INF
            │   └── web.xml                                      #B
            ├── css                                              #C
            │   ├── base.css
            │   └── bg.png
            └── jsp                                              #D
                ├── index.jsp
                └── todo-list.jsp

#A Web源文件默认目录
#B Web应用描述符文件
#C 存储描述如何展现HTML元素的样式单文件的目录
#D 存放JSP形式的动态脚本化视图组件

声明外部依赖
在实现这个Web应用的过程,我们使用的一些类,例如javax.servlet.HttpServlet,并非Java标准版(Java SE)的一部分。在构建工程之前,我们需要确保已经声明了这些外部依赖。在Java系统中,依赖类库是以JAR文件的形式去发布和使用的。许多类库可以从仓库,如一个文件系统或中央服务器,中获得。为了使用依赖,Gradle要求你至少定义一个仓库。出于一些考虑,我们将使用公共的可通过互联网进行访问的Maven Central仓库。
repositories {
   mavenCentral()                   #A
}
#A 通过http://repo1.maven.org/maven2访问Maven2中央仓库的简短标记
在Gradle中,依赖是通过配置项来进行分组的。我们将来Servlet依赖使用的配置项是providedCompile。该配置项用于那些在编译时而非运行时所需的依赖。像JSTL这样的运行时依赖,在编译时不会被用到,但在运行时则会被用到。它们都会成为WAR文件的一部分。下面的配置语句块声明了我们应用所需的外部类库:
dependencies {
   providedCompile 'javax.servlet:servlet-api:2.5'
   runtime 'javax.servlet:jstl:1.1.2'
}

构建工程
我们已经准备好构建这个工程了。另到工程中的一个Java插件任务名为build。该任务将编译源代码,运行测试程序并归集WAR文件--所有的这些任务都将以正确的顺序被执行。执行命令gradle build之后,你可能会得到形如下面的输出:
$ gradle build
:compileJava                                      #A
:processResources UP-TO-DATE
:classes
:war                                              #B
:assemble
:compileTestJava UP-TO-DATE                       #C
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test                                             #D
:check
:build

#A 编译产品的Java源代码
#B War插件提供的任务,用于归集WAR文件
#C 编译Java测试源代码
#D 运行单元测试

上述输出的每一行都代表执行了一个由Java或War插件提供的任务。你可能会注意到,有一些任务被标记为UP-TO-DATE。它的意思是指该任务被跳过去了。Gradle的增量构建支持策略会自动识别不需要执行的工作。特别是在大型商业项目中,该特性会极大地节省时间。
在该工程的根节目录中,你将会发现一个名为build的子目录,它包含有执行构建之后的全部输出,包括类文件,测试报告,归集的WAR文件,以及像manifest这样的在打包时需要的临时文件。如下就是执行构建工作之后的工程目录结构:
.
├── build
│   ├── classes
│   │   └── main                                          #A
│   │       └── com
│   │           └── manning
│   │               └── gia
│   │                   └── todo
│   │                       ├── model
│   │                       │   └── ToDoItem.class
│   │                       ├── repository
│   │                       │   ├── InMemoryToDoRepository.class
│   │                       │   └── ToDoRepository.class
│   │                       └── web
│   │                           ├── ToDoServlet$ToDoListStats.class
│   │                           └── ToDoServlet.class
│   ├── dependency-cache
│   ├── libs
│   │   └── todo-webapp.war                               #B
│   ├── reports
│   │   └── tests
│   │       ├── base-style.css
│   │       ├── css3-pie-1.0beta3.htc
│   │       ├── index.html
│   │       ├── report.js
│   │       └── style.css
│   ├── test-results
│   │   └── binary
│   │       └── test
│   │           └── results.bin
│   └── tmp
│       └── war
│           └── MANIFEST.MF                                #C
├── build.gradle
└── src

#A 包含Java类文件的默认目录
#B 归集的WAR文件
#C 用于WAR的临时manifest文件
你已经知道如何从一个基于标准目录结构的Web工程去构建WAR文件。现在是时候将它布署到一个Servlet容器中去了。在下一节中,我们将在本地开发机器中启动Jetty去运行这个Web应用。

运行应用
在本地机器中运行一个Web应用应该很容易,能够实践快速应用开发(RAD),并能够提供快速的启动时间。最棒地是,它不要求你部署一个Web容器运行时环境。Jetty一个流行的轻量级开源Web容器,它支持前面提到的所有特性。在这个Web应用中加入一个HTTP模块,它就变成了一个嵌入式实现。Gradle的Jetty插件扩展了War插件,它提供的任务可以将一个Web应用部署到嵌入式容器中,并能够启动该应用。在你的构建脚本中,可以像如下那样使用这个插件:
apply plugin: 'jetty'
这个将被我们用于启动Web应用的任务名为jettyRun。它甚至可以在无需创建WAR文件的情况下启动一个Jetty容器。执行上述命令后会得到如下形式的输出:
$ gradle jettyRun
:compileJava
:processResources UP-TO-DATE
:classes
> Building > :jettyRun > Running at http://localhost:8080/todo-webapp-jetty
在上述输出的最后一行中,该插件告诉了你Jetty即将侦听的请求地址。打开一个你喜欢的浏览器,并输入上述地址。最后,我们会看到这个To Do Web应用的行为。图2展示在一个浏览器中查看到该应用界面的截屏。

图2 To Do应用的Web界面及其行为

在你通过组合键CTRL+C去停止这个应用之后,Gradle会让它一直运行。Jetty如何知道使用哪个端口和上下文环境去运行这个Web应用?再说一遍,这就是规范。Jetty运行Web应用所使用的默认端口就是8080。

总结
只需要较少的努力,你就可以使用Gradle去构建并运行一个Java Web应用。只要你严格遵循标准目录结构,那么你的构建脚本仅需要两行代码。


Sha Jiang 2014-01-23 21:22 发表评论

相关 [gradle java web] 推荐:

使用Gradle构建Java Web应用(译)

- - BlogJava-首页技术区
使用Gradle构建Java Web应用. 本文是发布在 java.net上的一篇摘自于一书中的 节选,介绍了使用 Gradle构建Java Web应用的过程. 刚刚接触Gradle,看到了这篇小文,随手译了出来:-) (2014.01.23最后更新). 在职业生涯和私人生活中,我们中间的许多人要同时管理多个项目.

Gradle, 基于DSL的新一代Java构建工具

- - BlogJava-首页技术区
     摘要: Gradle 是以 Groovy 语言为基础,面向Java应用为主的,基于DSL语法的自动化构建工具. 说到java的自动化构建工具,大家一定对Ant和Maven都不会陌生,对,Gradle就是这样一种类似的工具,不过它比Ant和Maven强大的多. 想飞就飞 2012-06-26 17:38 发表评论.

xssProject在java web项目中应用

- - Java - 编程语言 - ITeye博客
1.项目引入xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar包. * 覆盖getParameter方法,将参数名和参数值都做xss过滤. * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
.

java web开发 高并发处理

- - 企业架构 - ITeye博客
java web开发 高并发处理. java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据). 一:高并发高负载类网站关注点之数据库. 没错,首先是数据库,这是大多数应用所面临的首个SPOF. 尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.

关于Java Web打印的选择

- - JavaScript - Web前端 - ITeye博客
 最近遇到一个项目,需要用到较为复杂的打印功能,包括批量打印等. 目前来说,一般一个简单的详情页面打印,直接调用window.print就行了;. 但遇到复杂的时候,我们可能会想到用集成好的控件来解决,当然,如果你有时间又不怕麻烦,你也可以自己写一堆js. 这里,我就先抛砖引玉对两个比较常用的打印控件谈谈自己的看法.

Java Web 服务性能优化实践

- - 博客 - 伯乐在线
来源: IBM developerworks. 简介: 本文介绍如何提升 Java Web 服务性能,主要介绍了三种方法:一是采用 Web 服务的异步调用,二是引入 Web 服务批处理模式,三是压缩 SOAP 消息. 重点介绍在编程过程中如何使用异步 Web 服务以及异步调用和同步调用的差异点. 本文还示范了如何在项目中使用以上三种方法,以及各种方法所适合的应用场景.

[Java Web]敏感词过滤算法

- - CSDN博客推荐文章
DFA算法的原理可以参考 这里,简单来说就是通过Map构造出一颗敏感词树,树的每一条由根节点到叶子节点的路径构成一个敏感词,例如下图:. LOG.error("sensitiveWordMap 未初始化!");. LOG.error("敏感词库文件转码失败!");. LOG.error("敏感词库文件不存在!");.

eclipse下利用gradle构建项目

- - CSDN博客研发管理推荐文章
在 eclipse 下利用 gradle 构建系统. 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对应版本的其他工具,包括开发工具、Java EE 服务器、Apache Ant、SoapUI. 开发工具:Eclipse IDE for SOA Developers 版本,请到  http://www.eclipse.org/downloads/ 网站下载,当然任何版本的 eclipse 都是可以的.

Java Web应用Web层异步化应该考虑的问题

- - 企业架构 - ITeye博客
        之前做了一个项目,要用到web层的异步化技术,在实际实现中,遇到了很多问题,作为教训简单罗列下. 1、app 容器/J2EE框架对异步的支持.         在tomcat5、jboss4的时候,每一个请求都用了一个app容器线程来执行,app线程必须一直处理完或者等待别的线程处理完,才能拿着请求的链接把结果写回到客户端.

Java 开发 2.0: 使用 Gretty 的超轻量级 Java Web 服务

- 圣斌 - IBM developerWorks 中国 : 文档库
Gretty 是构建 Web 服务超轻量级框架的新学派之一. 构建于极快的 Java NIO API 之上,Gretty 将 Groovy 用作 Web 端点和 Grape 的 Maven 式依赖关系管理的一种域特定语言. 本文介绍如何开始使用 Gretty 来构建和部署 Java Web 服务应用程序.