gradle java ide_使用Gradle构建Java项目

使用Gradle构建Java项目

这个手册将通过一个简单的Java项目向大家介绍如何使用Gradle构建Java项目。

我们将要做什么?

我们将在这篇文档航中创建一个简单的Java项目,然后使用Gradle构建它。

需要准备什么?

预留15分钟空闲时间

一件称手的兵器(你最喜欢的IDE或者文本编辑器)

Java环境([JDK6](http://www.oracle.com/technetwork/java/javase/downloads/index.html”JDK”及以上版本)

如何完成这个手册的内容?

与大多数Spring的入门手册一样,你可以从头开始一步步完成教程中的每一步工作,也可以跳过你已经烂熟的基础步骤。不管采用那种方式,你最后都会得到可工作的代码。

如果要重头开始,猛戳这里

如果要跳过基础部分,需执行以下操作:

下载并解压本文档相关源代码,或者使用Git克隆一个:git clone https://github.com/spring-guides/gs-gradle.git

cd 进入 gs-gradle/initial

当你完成后,你可以使用gs-gradle/complete来检查你的结果。

配置项目

首先需要配置一个项目给Gradle进行构建。为了保证我们能专注于Gradle,目前最好创建最简单的Java项目。

创建目录结构

在项目主目录下,创建以下子目录;在*nix系统下可以使用命令:mkdir -p src/main/java/hello

在src/main/java/hello目录中,你可以创建任何Java类。为简单起见并且为了与指南的其余部分保持一致,我们建议创建两个雷HelloWorld.java和Greeter.java

src/main/java/hello/HelloWorld.java的源代码:

src/main/java/hello/Greeter.java的源代码:

安装Gradle

到目前为止,我们已经搭建了一个可以用来使用Gradle构建的项目,现在到了安装Gradle的时候了。

Gradle可以从http://www.gradle.org/downloads下载。我们仅需要下载Gradle的二进制发布包,所以在刚才提供的连接上寻找gradle-version-bin.zip文件(当然,也可以下载gradle-version-all.zip,它包含源代码、文档以已编译代码)

解压缩下载的文件,并将解压后目录中的bin目录加到环境变量中。

可以在命令行中执行以下代码来测试Gradle是否安装成功

如果你很幸运,嘛事都OK,你会看到下面的welcome信息:

看到这个了,说明Gradle已经成功安装到系统中了。如果没看到……再去看看Gradle的手册先。

Gradle可以做些什么呢?

Gradle已经安装到系统上了,那么它可以做什么呢?在我们为项目创建build.gradle文件之前,我们可以先问一下Gradle目前有哪些可用的任务(Tasks):

我们可以看到可用任务(Tasks)的列表。假设你执行Gradle的目录不存在build.gradle文件,你可以看到一些非常基础的任务,类似于:

尽管上面的列出的任务是可用的,但是如果没有项目的构建配置他们无法提供太多的价值。当配置了项目的build.gradle后,一些任务将变得非常有用。

如果在build.gradle中配置了插件(plugins)上面的任务列表会变得更长,最好在配置插件后使用gradle task看看那些任务是可用的。

刚说到配置插件,马上我们就会配置一个插件来启用基础的Java构建功能。

构建Java代码

先从简单的开始,创建一个最简单的只有一行的build.gradle文件:

别看只有一行配置,提供的能力可不是一点点哦。再执行一下gradle task,我们可以看到任务列表中增加了一些内容,比如:用来编译java项目的任务、用来创建JavaDoc的任务、用来执行单元测试的任务。

我们经常使用的任务是gradle build,这个任务执行以下操作:编译、执行单元测试、组装Jar文件:

几秒钟以后,会看到”BUILD SUCCESSFUL”输出,说明构建已经完成了。

可以到”build”目录中查看构建结构,在这个目录中我们可以看到很多子目录,其中有三个我们需要特别注意:

classes: 保存被编译后的.class文件

reports: 构建报告(如:测试报告)

lib: 组装好的项目包(通常为:.jar或者.war文件)

classes目录包含编译生成的所有.class文件。执行完编译后,我们应该可以在这里找到”HelloWorld.class”和”Greeter.class”。

到目前为止,我们项目并没有申明任何依赖,所以”debendency_cache”目录是空的。

“reports”目录会包含项目单元测试的测试报告,当然,当前项目并未编写任何单元测试,所以,也是空目录。

“lib”目录包含打包后的jar或war文件,在后面的内容中我们将学会如何定义JAR的名称和版本号。

申明依赖

我们的Hello World例程非常简单且不依赖于任何第三方库,但是大多数应用程序都会依赖第三方库提供的通用或复杂的功能。

例如:假设我们希望更好的说”Hello World!”,我们希望应用程序能同时输出当前的日期和时间。当然这可以使用Java自身的日期和时间相关库,但是我们可以使用”Joda Time”库实现更有趣的功能。

首先,把HelloWorld.jara类修改成下面这样:

这里我们的HelloWorld使用”Joda Time”的LocalTime类来获取和输出当前时间。

如果我们马上执行gradle build来构建项目,构建过程将会失败,因为我们并未将”Joda Time”库声明为编译时依赖库。

首先,我们需要添加一些配置来定义第三方库的来源:

上面的repositories定义,告诉构建系统通过Maven中央库来检索项目依赖的软件包,Gradle在很大程度上依赖Maven构建工具的许多约定和基础功能,包括使用Maven中央的库来处理依赖关系。

现在我们可以使用第三方库了,但现需要定义:

使用dependencies块,我们定义了一条Joda Time的依赖项。这里,明确指定使用joda-time组内的版本为2.2的joda-time库。

另一个要注意的是,我们在这个依赖定义中指定依赖是compile范围的。意思是,这个库在编译和运行时都需要(如果我们正在构建WAR文件,这个文件会在/WEB-INF/libs目录下)。另外值得注意的依赖类型包括:

providedCompile:在编译期间需要这个依赖包,但在运行期间可能由容器提供相关组件(比如:Java Servlet API)

testCompile:依赖项仅在构建和运行测试代码时需要,在项目运行时不需要这个依赖项。

最后,我们来定义我们将生成的Jar文件的名字:

jar块定义如何命名JAR文件,在上面的例子中,我们的JAR文件的名字为:gs-gradle-0.1.0.jar。

注:这个时候如果执行gradle build,Gradle会花一些时间从Maven中央库下载Joda Time包(具体下载时间依赖于你的网速)

使用Gradle Wrapper来构建项目

Gradle Wrapper是开始一个Gradle构建的首选方式。它包含了windows批处理以及OS X和Linux的Shell脚本。这些脚本允许我们在没有安装Gradle的系统上执行Gradle构建。要实现这个功能,我们需要在我们的build.gradle文件中增加以下代码:

执行下面代码来下载和初始化wrapper脚本:

命令执行完后,我们可以看到增加了一些新文件。有两个文件在根目录下,wapper的jar文件和properties文件在新增的gradle/wrapper目录下。

现在Gradle Wrapper已经可以用来构建系统了。把这些文件增加到版本控制系统中,然后再任何时候、任何地方只要迁出这些文件就一个按照同样的方式(与当前生成 Wrapper的Gradle版本一致)构建系统。运行wrapper脚本来构建系统,跟我们之前桥的命令很像:

当第一次通过wrapper使用指定版本的Gradle构建系统时,wrapper首先下载对应版本的Gradle可执行文件。Gradle Wrapper的所有文件在都可以被提交到版本库中,所以,任何人都可以在没有安装Gradle的环境下使用相同版本的Gradle构建系统。

在这个时候,我们需要重新构建我们的代码,构建的结果目录如下:

Jar文件中包含我们希望打包的Gretter和HelloWorld类。

需要注意的,即使我们声明了joda-time依赖,但这里也没有包括对应的库文件,而且生成的JAR文件也不是可运行JAR文件。

要想让代码可以运行,我们可以使用Gradle的application插件。增加以下内容到build.gradle文件中。

现在我们的app可以执行了。

为了能够将依赖包也以一起打包,比如,我们希望构建一个WAR包,可以包含第三方组件的打包格式,我们可以使用Gradle的WAR插件。如果我们使用Spring Boot并且希望得到一个可执行的JAR文件,我们可以使用spring-boot-gradle-plugin插件。在我们的示例中,gradle没有足够的信息来了解我们的目标系统。但是,目前介绍的内容已经足够我们开始使用Gradle了。

下面是本文需要用的的build.gradle文件:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小马激活软件下载,当心伪小马,有病毒

官方的小马激活软件已经停止更新了,下文是官方停更公告。 http://www.pccppc.com/xiaomajihuo-html 所以小马oem7以后的都不是官方的,包含病毒。重装系统后,一般是先激活系统,再安装杀毒软件,这就给“伪小马激活工具”…

truncate,delete,drop之间的区别

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。 但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。 TRUNCATE…

三张图搞懂JavaScript的原型对象与原型链

对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__proto__混淆,二来它们之间的各种指向实在有些复杂,其实市面上已经有非常多的文章在尝试说清楚,有一张所谓很经典的图,上面画了…

python partial_如何在python多处理模块中使用partial函数?

下面是我如何解决这个问题的一个简单例子from functools import partialfrom multiprocessing import Pooldef VariadicLifter(func, args):return func(*args)def func(x,y,z,a):return x2*y3*z4*aif __name__ __main__:func_ partial( func, 500, 1007)lfunc_ partial( Va…

Mybatis中resultMap

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接 表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。 1.resultType …

超简单的mysql多实例布置

一、基本概念mysql下载:http://mirrors.sohu.com/mysql/MySQL-5.5/1、MySQL多实例就是在一台机器上面开启多个不同的端口,运行多个MySQL服务进程。这些MySQL多实例公用一套安装程序,使用不同的(也可以是相同的)配置文件,启动程序&…

java程序设计计算器_Java程序设计计算器(含代码)

Java程序课程设计任务书实用性计算器的设计与开发1、主要内容:开发一个实用型的计算器程序,实现基本的计算功能同时并进行相应的功能拓展,使其具更加人性化的功能。我们可以用其进行相应的计算功能来方便我们的学习,代替我们进行一…

mybatis配置insert/update/delete同一个模板

insert,update,delete标签只是一个模板,在操作时是以sql语句为核心的, 即在做增/删/改时,insert/update/delete便签可以通用, 但做查询时只能用 select 标签 提倡什么操作就用什么标签 这就是为什么 ex…

Mybatis配置文件resultMap映射啥时候可写可不写?

1、student实体类 public class Student {private Integer id;//编号private String name;//姓名private Double sal;//薪水public Student(){}public Student(Integer id, String name, Double sal) {this.id id;this.name name;this.sal sal;}public Integer getId() {ret…

arithmetic java_Java:Arithmetic

好吧,事实上你有方法设置变量叫get - 这显然不是一个好主意,并且没有缩进......但它应该有效。但是,你还没有展示出你是如何使用它的。也许你实际上并没有被称为setter方法?以下是相同代码但具有不同名称的示例,以及使…

网络框架 Retrofit(三)

简单实现Retrofit(替代Okhttp) 1.定义注解参数 Documented Target(PARAMETER) Retention(RUNTIME) public interface Field {String value(); } 复制代码Documented Target(METHOD) Retention(RUNTIME) public interface Get {String value() default &q…

Tomcat提示“XDB 的服务器 localhost 要求用户名和密码”

在地址栏输入http://localhost:8080/(8080是TOMCAT的端口号)测试,系统提示“XDB 的服务器 localhost 要求用户名和密码”,并弹出输入用户、密码的窗口,查看代码没问题,不解,上网上查资料,是因为…

java jqgrid json格式_jqGrid 数据之 Json

Json数据需要定义jsonReader来跟服务器端返回的数据做对应,其默认值: jsonReader : { root: "rows", page: "page", total: "total", records: "records", repeatitems: true, c…

django 中静态文件项目加载问题

问题描述: django项目中创建了多个app后,每个app中都有对应的static静态文件。整个项目运行时这些静态文件的加载就是一个问题,因为整个项目我只参与了一部分,项目部署之类的并没有参与。我写的部分的js代码遇到点问题&#xff0c…

Erlang/OTP设计原则(文档翻译)

http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1。 这个设计原则,其实是说用户在设计系统的时候应遵循的标准和规范。阅读前我一直以为写的是作者在设计 Erlang/OTP 框架时的一些原…

存储过程的参数可以使用sql的函数

系统已做成存储过程,调用方法如下: crh_entry(yyyymmdd,起始时间,结束时间); 示例1:进行2016年4月10日10时到12时的测试,应写为: exec crh_entry(20160410,10,11); 示例2:进行2016年4月8日14时到15时的…

java如何实例化集合_如何在java中实例化一个Queue对象?

Queue是一个接口,这意味着你不能直接构造一个Queue 。最好的select是构造一个已经实现Queue接口的类,如下所示: AbstractQueue , ArrayBlockingQueue , ConcurrentLinkedQueue , DelayQueue , D…

leetcode 121 股票买卖问题系列

描述: 给一些列数字,表示每条股票的价格,如果可以买卖一次(不能同一天买和卖),求最大利益(即差最大)。 其他三道问题是,如果能买卖无限次,买卖两次&#xff0…

Mybatis-jar-lib

csdn的下载好像和我有仇,上传资源不断提示:请您先登录 下载:http://pan.baidu.com/s/1pL2BAzT asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1.1.jar mybatis-3.1.1.jar ----以上mybatis的--- log4j-1.2.16.jar ----以上log4j日志--…

java使用队列实现栈思路_算法面试:队列实现栈的方案

声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本篇介绍的是如何用两个队列实现栈的问题。这道题作为上一篇文章算法面试:栈实现队列的…