设为首页 收藏本站
查看: 1183|回复: 0

[经验分享] Gradle构建Java Web应用(转)

[复制链接]

尚未签到

发表于 2017-3-2 08:45:06 | 显示全部楼层 |阅读模式
  转自: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应用。只要你严格遵循标准目录结构,那么你的构建脚本仅需要两行代码。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-349039-1-1.html 上篇帖子: java 下篇帖子: 出现异常:Unsupported major.minor version
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表