转自:http://www.blogjava.net/jiangshachina/archive/2014/02/03/409285.html

本文是发布在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应用。只要你严格遵循标准目录结构,那么你的构建脚本仅需要两行代码。

Gradle构建Java Web应用(转)的更多相关文章

  1. Gradle构建Java Web应用:Servlet依赖与Tomcat插件(转)

    Gradle的官方tutorial介绍了构建Java Web应用的基本方法.不过在使用Servlet做上传的时候会碰到问题.这里分享下如何通过Servlet上传文件,以及如何使用Gradle来构建相应 ...

  2. Eclipse中使用Gradle构建Java Web项目

    Gradle是一种自动化建构工具,使用DSL来声明项目设置.通过Gradle,可以对项目的依赖进行配置,并且自动下载所依赖的文件,使得构建项目的效率大大提高. 1. 安装Gradle 下载Gradle ...

  3. 使用Gradle创建java web项目

    什么是Gradle? Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML ...

  4. 使用Eclipse+Maven+Jetty构建Java Web开发环境(几个教程综合集成2014发行)

    工作需要使用Jetty由于web集装箱,得知Eclipse+Maven+Jetty该组合是非常好的,因此,要在网上找了很多教程,但不写或多或少特定的或过时的内容而导致最终的配置失败,易于配置为未来的同 ...

  5. 使用 Gradle 构建 Java 项目

    使用 Gradle 构建 Java 项目 这个手册将通过一个简单的 Java 项目向大家介绍如何使用 Gradle 构建 Java 项目. 我们将要做什么? 我们将在这篇文档航中创建一个简单的 Jav ...

  6. 使用IntelliJ IDEA和Maven构建Java web项目并打包部署

    爱编程爱分享,原创文章,转载请注明出处,谢谢! http://www.cnblogs.com/fozero/p/6120375.html 一.背景 现在越来越多的人使用IntelliJ IDEA工具进 ...

  7. 使用IntelliJ IDEA,gradle开发Java web应用步骤

    最近 正在学习gradle构建工具的使用,看了一堆的文档,有点一知半解,索性动作实践一把,在以后的自己的项目中尝试使用看看.目前手头用的是IntelliJ IDEA 14,搭建了一天终于明白怎么集成g ...

  8. 使用gradle构建java项目

    gradle是什么东东 gradle是继ant,maven之后另外一种的面向java的自动化项目构建工具,他是基于groovy语言的.相对于ant,maven,gradle显得更加简单. 安装grad ...

  9. Myeclipse 10 Maven 构建 Java Web 项目

    主要介绍如何使用 Myeclipse 10 构建 Maven Web 项目,关于 Maven 的介绍就略过了. 工具/原料 myeclipse apache-maven-3.1.0 方法/步骤 1 下 ...

随机推荐

  1. 使用WMI来控制Windows目录 和windows共享机制

    1.使用WMI来控制Windows目录 本文主要介绍如何使用WMI来查询目录是否存在.文件是否存在.如何建立目录.删除目录,删除文件.如何利用命令行拷贝文件,如何利用WMI拷贝文件 using Sys ...

  2. 使用less函数实现不同背景的CSS样式

    今天在公司遇到一个比较特殊的需求,需要完成这样的布局,如下图: 每一个块的背景需要不同,而其他都是相同的,这时候就应该把背景提出来单独写成一个CSS样式类. 那么问题来了,有四个不同的背景需要写4个基 ...

  3. Firefox中Vimperator插件配置

    具体配置什么,同学们可以网上看下善用佳软关于Vimperator的说明,在这里我列出两条我个人觉得最有用的命令 set nextpattern=\s*下一页|下一张|下一篇|下页|后页\s*,^\bn ...

  4. javascript读取xml的方法【转载】

    jquery读取xml文件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  5. C#.net 货币格式转换

    /// <summary> /// 输入Float格式数字,将其转换为货币表达方式 /// </summary> /// <param name="ftype& ...

  6. 数据类型和Json格式[转]

    1. 前几天,我才知道有一种简化的数据交换格式,叫做yaml. 我翻了一遍它的文档,看懂的地方不多,但是有一句话令我茅塞顿开. 它说,从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一 ...

  7. Scrapy使用以及Xpath的一些坑, 再入剁手

    scrapy爬虫: https:www.scrapy.org 本篇博客依托的项目: https://github.com/viciousstar/BitcointalkSpider/ 一. Scrap ...

  8. 多项式求和 AC 杭电

    多项式求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. Python异常的使用

    伪代码: try: 出错部分的代码...... except Exception as e: print '404网页' #Exception是所有错误类型的父类,包括所有出错信息 finally: ...

  10. Xcode升级导致插件失效的解决办法-b

    作为iOS界的攻城师,每一次水果发布新的Xcode开发版本时,我们都会跟进,然而那些好用的Xcode插件都会莫名的失灵...对此我各种百度,在这里,我将跟大家分享我是如何解决这些问题的.当然,我的方案 ...