gradle入门中文教程

—————————下面是废话,可以忽略—————————-
第一次见到gradle是在写Android的时Android Studio下方的提示,那时候还没有仔细研究。第二次是在搭建校内中央认证的时候,由于需要研究代码不得不从源码导入idea,但是官方只有一堆源码,没有任何idea的项目文件。idea的依赖是存在.idea文件夹下的xml中的,而这个项目的依赖都写在了gradle文件中,当时费了好多时间才把官方4.2.0的源码成功导入,手工解决各种依赖问题,我高估了idea,还以为它能解析gradle并自动识别各种依赖呢,事实证明它确实能导入,但是依赖的级别都是错的或者有丢失。(顺便吐槽一下,如果一个jar中的依赖缺失是不会报错的,手动微笑)
官方文档居然一点提示都没有→_→后来偶然发现build.gradle文件中有这么几行

瞬间脑洞大开,想到当时写QQ机器人时候用的boost库的安装,是先根据需要生成不同版本vs的sln文件再导入到vs中,怀疑这个会不会一样的套路。

由于还看不懂build.gradle的语法,但是大概猜到意思是所有的项目使用了这几个插件,于是去gradle文档翻了翻,果然看到了这个文档

原文:The IDEA plugin generates files that are used by IntelliJ IDEA, thus making it possible to open the project from IDEA (File – Open Project). Both external dependencies (including associated source and Javadoc files) and project dependencies are considered.
意思是说这个插件可以生成idea所需的文件,让这个项目可以通过idea打开。

啊~~我花了这么长时间都在干些啥,再次鄙视CAS官方没在4.2.x文档写清楚,咳咳
今天特意上去看了下,4.2.x的文档确实没写,臻不是我没看到。我有句XXX一定要讲!最新版本的文档在开发者一栏增加了Build Process的教程传送门

论写好文档的重要性T T虽然我也懒的写(逃

—————————上面是废话,可以忽略—————————-

扯了这么多废话还是说正事吧,咳咳。

1.安装

要求:gradle可以在当前主流的平台上运行,仅仅需要jre或jdk7以上就可以。
如果你已经有一个使用gradle生成的项目,并且使用了GradleWrapper的话,就不需要安装任何其他的东西了,只要运行gradlew这个shell脚本就可以了,windows下为gradlew.bat,这个脚本会下载项目对应的gradle版本。但是我不推荐使用,国内的网你懂得。
windows上手动安装只需要下载这个包(传送门)然后解压即可。记的把bin目录加到环境变量PATH中。

Ubuntu上更简单apt-get install gradle,不解释了。

安装完成后运行gradle -v检查版本。
另外官方支持Zsh和Bash的自动完成脚本(传送门)

2.基本使用

如果你用过linux的make编译软件,那么你会比较容易理解gradle,感觉很像。
新建一个文件夹,里面放入一个名为build.gradle的文件,内容如下:

依赖关系如图(不知道能不能直接用官方图。。。如果不能自己点开吧)
图片地址:https://docs.gradle.org/current/userguide/img/commandLineTutorialTasks.png

进入命令行执行gradle dist,输出如下

每一个任务都有自己的依赖,当任务自己不依赖其他任务时候,就可以开始执行了,按拓扑序列执行所有任务,直到指定的dist完成。
如果想跳过某个任务,使用-x参数,例如gradle dist -x test跳过了test任务

默认情况下,gradle执行时候如果碰到有任务失败就会停下来,如果你为了尽可能多的发现错误,可以使用--continue参数。这时候如果有某个任务的依赖执行失败,那么这个任务也会被跳过。

当执行命令行时,可以使用任务名简写,只要给出的名字能确定唯一任务就行。例如di指的是dist,cT指的是compTest。

gradle tasks用来列出可以执行的任务列表。
gradle help --task someTask 用来查看某个任务的详细说明。
gradle -m someTask 用来查看某个任务的执行顺序,但是并没有真的执行。

3.Gradle Wrapper

大多数工具在使用之前要求你安装一些东西,如果他们安装简单那是最好的。但是如果像Hadoop安装一样繁琐,你就会感觉好气啊,怎么还不能用。更重要的是版本问题,如果版本不兼容怎么办?Gradle Wrapper同时解决了这些问题。
如果一个项目使用了Wrapper(官方建议每个项目都用),你可以像上文提到的那样使用gradle 来执行构建任务。(虽然我不推荐,因为网速实在是感人)

每个Wrapper都知道自己应该下载什么版本的gradle,所以不用担心版本问题。
这些文件很重要,不能删
gradlew (Unix Shell script)
gradlew.bat (Windows batch file)
gradle/wrapper/gradle-wrapper.jar (Wrapper JAR)
gradle/wrapper/gradle-wrapper.properties (Wrapper properties)

当通过Wrapper导入IDE的时候,IDE会使用Gradle的all版本,这可以帮助IDE更好的完成代码补全(个人建议安装的时候就下载all版本)
Wrapper下载的Gradle默认存放位置为
linux上为~/.gradle/wrapper/dists
windows上为C:\Users\<你的用户名>\.gradle\wrapper\dists

4.Gradle Daemon

From Wikipedia:
A daemon is a computer program that runs as a background process, rather than being under the direct control of an interactive user.

从3.0开始Gradle默认会启动一个守护进程,来减少每次build时候启动JVM的时间,并且可以在内存缓存项目相关的信息。
使用gradle --status查看守护进程
使用gradle --stop停止守护进程
在gradle.properties文件中写入org.gradle.daemon=false,并把文件放在默认目录下即可禁用守护进程。
linux上为~/.gradle/wrapper/dists
windows上为C:\Users\<你的用户名>\.gradle\wrapper\dists

5.依赖管理

大概来说,依赖管理由两步组成。Gradle需要知道你构建或运行项目需要的东西。第一步:找到它们,我们把这些文件叫做项目的依赖。第二步:Gradle需要把这些文件编译链接重组结构到你的产品中,我们把生成的文件叫做项目产品。

大多数项目的编写或测试都需要依赖其他的项目,例如为了使用Hibernate,在编译时候我需要把一些jar文件包含到我的classpath中,为了运行单元测试我需要额外的JUnit的jar包,还有就是JDBC数据库驱动等

这些外部依赖可能是远程的、本地的、子项目的等,Gradle需要知道这些依赖信息,并且把他们加载进来,我们把这个过程叫做依赖解析。

下面这段说的是Gradle比Ant更NB,不翻译了=_=好累.
Note that this feature provides a major advantage over Ant. With Ant, you only have the ability to specify absolute or relative paths to specific jars to load. With Gradle, you simply declare the “names” of your dependencies, and other layers determine where to get those dependencies from. You can get similar behavior from Ant by adding Apache Ivy, but Gradle does it better.

通常项目的依赖也会有他们的依赖,例如Hibernate的核心要求其他的几个库来运行,所以当Gradle运行项目测试的时候也需要找到这些依赖的依赖,叫做传递依赖。

大多数项目的目的是生成其他项目可用的库,例如Java Library,你需要生成jar文件或者包括源码和文档的jar文件并且发布出去。我们把这个过程叫做发布。
下面大概说Gradle非常关心你的用户体验,它能帮你把产品发布到任何地方(中文的博大精深)。
These outgoing files form the publications of the project. Gradle also takes care of this important work for you. You declare the publications of your project, and Gradle take care of building them and publishing them somewhere. Exactly what “publishing” means depends on what you want to do. You might want to copy the files to a local directory, or upload them to a remote Maven or Ivy repository. Or you might use the files in another project in the same multi-project build. We call this process publication.

示例代码:

上面的脚本声明了项目编译时需要Hibernate core 3.6.7.Final版本,言外之意是在运行时依然需要Hibernate和它自身的依赖。同理在编译单元测试的时候依赖junut4.0以上版本。同时它告诉Gradle在Maven中心仓库寻找任何其他需要的依赖。

Gradle依赖是分组管理的,一个配置组代表了一系列的依赖,Java插件定义了一系列标准配置。详见这篇文档

compile 这些依赖在编译时需要。
runtime 这些依赖在运行时需要,默认情况下已经包含了compile依赖。
testCompile 这些依赖在编译测试代码时需要。默认情况下也包含了所有编译后的class文件和compile依赖。
testRuntime 这些依赖在运行测试时候需要,默认情况下包含上面3个所有的依赖。

许多组件添加了很多标准配置,你可以定义你自己的配置,详见这篇文档.

示例:
外部依赖声明

第二个写法是简写
关于仓库设置不再啰嗦:原文传送门

(未完待续。。。。)

参考:http://wiki.jikexueyuan.com/project/GradleUserGuide-Wiki/
https://gradle.org/docs

Getting Started Gradle


https://docs.gradle.org/3.3/dsl/index.html
https://gradle.org/install
https://gradle.org/getting-started/creating-a-build
https://docs.gradle.org/current/userguide/userguide.html
http://www.cnblogs.com/davenkin/p/gradle-learning-1.html

Gradle入门系列(1):简介

Gradle入门系列(2):第一个Java项目

Gradle入门系列(3):依赖管理

5 Comments
  1. 富强、民主、文明、和谐,自由、平等、公正、法治, 爱国、敬业、诚信、友善。

  2. 从百度进来的,博客不错哦!

  3. 对你爱爱爱不完,我可以天天月月年年看你博客到永远!

Leave a Reply