在java中使用gradle
一 搭建环境
Gradle 需要运行在一个 Java 环境里
- 安装一个 Java JDK 或者 JRE. 而且 Java 版本必须至少是 6 以上.
- Gradle 自带 Groovy 库, 所以
没必要安装
Groovy. 任何已经安装的 Groovy 会被 Gradle 忽略.
下载
你可以从 Gradle网站 下载任意一个已经发布的版本。我是下载了一个complete版本。
解压缩
Gradle 发布的版本为 ****ZIP 格式. 所有文件包含:
- Gradle 的二进制文件.
- 用户指南 (HTML 和 PDF).
- DSL参考指南.
- API文档 (Javadoc和 Groovydoc).
- 扩展的例子,包括用户指南中引用的实例,以及一些更复杂的实例来帮助用户构建自己的build.
- 二进制源码.此代码仅供参考.
设置环境变量
然后我们需要设置环境变量
- 添加一个
GRADLE_HOME
环境变量来指明 Gradle 的安装路径 - 添加
%GRADLE_HOME%\bin
到您的 PATH 环境变量中. 通常, 这样已经足够运行Gradle了. - 检查是否成功,
gradle -v
构建工具
- 依赖管理
- 测试、打包、发布
- 机器能干的活,绝不自己动手
二 groovy实践
创建项目
在idea中创建一个gradle项目
注意点
- 勾选使用本地的gradle
- 开启
auto-import
gradle目录结构
和maven的目录结构是一样的
src/main/java application library sources - java源代码文件
src/main/resources application library resources - 资源库,会自动复制到classes文件夹下
src/main/filters resources filter files - 资源过滤文件
src/main/assembly assembly descriptor - 组件的描述配置,如何打包
src/main/config configuration files - 配置文件
src/main/webapp web application sources - web应用的目录,WEB-INF,js,css等
src/main/bin 脚本库
src/test/java 单元测试java源代码文件
src/test/resources 测试需要的资源库
src/test/filters 测试资源过滤库
src/site 一些文档
target/ 存放项目构建后的文件和目录,jar包,war包,编译的class文件等;Maven构建时生成的
pom.xml 工程描述文件
LICENSE.txt license
README.txt read me
打开groovy控制台
image.png语法
和java比较
- 完全
兼容java
的语法 - 分号是可选的
println("zyc");
//groovy可以省略最末尾的分号
//groovy可以省略括号
println"zyc"
- 类、方法默认都是public
- 编译器给属性自动添加getter/setter方法
- 属性可以直接用点号获取
- 最后一个表达式的值会作为
返回值
-
==
等同于equals
,不会抛NullPointexception
示例
class Person{
int age;
String name//分号省略
public Person(String name,int age){
this.name = name;
this.age = age;
}
}
//兼容java
Person me = new Person('zyc',18);
Person you = null
println me == you
println me.getAge()
println me.name
高级特性
- asset语句
def age =12
assert age = 14
- 可选类型定义(弱类型语言)
- 可选的括号
- 字符串,三种表现形式:单引号、双引号、
三个单引号
//字符串
def nationality = 'chiness'
def s1 = 'china'//只是字符串
def s2 = "i am ${nationality}"//可以有变量
def s3 ='''my name
is
lihua
'''//可以换行
println s1
println s2
- 集合API
- 闭包
定义集合、map
//通过def来定义,groovy是弱类型的
def i =18
println i
//定义一个集合
def array = ['a','b']
//添加元素
array << 'zyc'
//取出元素
println array.get(2)
//定义map
def map = ['name':'zyc','age':23]
//添加键值对
map.address = 'anji'
map.age = 22
//取出元素
println map.get('age')
println map['age']
println map.get("address")//单双引号都可以
闭包
//什么是闭包?
//闭包就是一段代码块,我们把这段代码当参数来使用
//定义一个闭包
def say = {
println 'hello zhuyc'
}
//再定义个函数
def method1(Closure closure){
closure()
}
//执行
method1(say)
//定义一个闭包,带有参数
def eat = {
v ->
println "eat ${v}"
}
//再定义个函数
def method2(Closure closure){
closure("kfc")
}
//执行
method2(eat)
三 gradle实践
基本配置
//构建脚本中默认都有个Project实例
plugins {
id 'java'
}
//apply plugin:'java' 者本质是一个方法,省略了括号
group 'com.zyc'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
/**
* 指定使用的仓库
*/
repositories {//本质是一个方法,接收了闭包
mavenCentral()//表示中央仓库
}
/*
*testCompile:表示jar包的作用域是测试时期。
* 我们再添加jar包坐标时,必须添加作用域
*
*/
dependencies { //本质:dependencies(Closure var1)
testCompile group: 'junit', name: 'junit', version: '4.12'
}
使用本地maven仓库
- 配置环境变量
GRADLE_USER_HOME
,值为maven仓库 - 检查
service directory path
是否变成了我们设置的GRADLE_USER_HOME
环境的变量的位置。我试了没变,就自己设置了
image.png - 配置仓库
mavenLocal()
repositories {
mavenLocal()
mavenCentral()//表示中央仓库
}
打jar包
编写类
编写一个带有main
方法的类
package com.zyc.todo;
/**
* @author zhuyc
* @create 2019-06-29 15:11
*/
public class Todo {
public static void main(String[] args) {
System.out.println("todo jar running");
}
}
执行命令
其实此时点击
build
的效果和点击jar
一样。因为build.gradle中指定了项目的打包类型是jar
打包成功
image.png
测试
E:\workspace\idea\grovvy\build\libs>java -classpath grovvy-1.0-SNAPSHOT.jar com.zyc.todo.Todo
>todo jar running
四 高级应用
构建块
Gradle
构建中的两个基本概念是项目(project
)和任务(task
),每个构建至少需要一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个依赖关系图来确保它们的执行顺序
项目
一个项目代表一个正在构建的组件(比如一个jar文件),当构建启动后,gradle会基于build.gradle
实例化一个org.gradle.api.Project
类,并且能够通过project变量
使其隐式可用
任务
任务对应org.gradle.api.Task
。主要包括任务动作和任务依赖。任务动作定义了一个最小的工作单元
。可以定义依赖于其他任务、动作序列和执行条件。
添加自定义任务
//先定义一个闭包
def createDir = {
path ->
File dir = new File(path)
if(!dir.exists()){
dir.mkdirs()
}
}
task makeJavaDir(){
def paths = ['src/main/java','src/main/resources','src/test/java','src/test/resources']
doFirst {//这里相当于定义了一个匿名闭包
paths.forEach(createDir)
}
}
task makeWebDir(){
dependsOn('makeJavaDir')
def paths = ['src/main/webapp','src/test/webapp']
doFirst {//这里相当于定义了一个匿名闭包
paths.forEach(createDir)
}
}
生命周期
分为配置代码和执行代码(通过doLast,doFirst
添加的),
image.png
钩子方法
image.png版本冲突
image.png解决冲突
- 查看依赖报告
- 排除传递性依赖
compile (group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final'){
exclude group: 'org.slf4j', module: 'slf4j-api'
}
- 强制一个版本
configurations.all{
resolutionStrategy{
// 修改gradle不处理版本冲突
failOnVersionConflict()
force 'org.slf4j:slf4j-api:1.7.24'
}
}
注意
Transitive用于自动处理子依赖项。默认为true,gradle自动添加子依赖项,形成一个多层树形结构;设置为false,则需要手动添加每个依赖项,不推荐transitive=false
compile('org.hibernate:hibernate-core:3.6.3.Final'){
transitive=false
}
gradle默认的解决方式是依赖最高版本的jar包
这点可以通过gradle的help-dependencies
命令查看
修改默认冲突解决策略,便于发现冲突
configurations.all{
resolutionStrategy{
// 修改gradle不处理版本冲突
failOnVersionConflict()
}
}
五 深入实战
项目模块化
image.png依赖关系
配置要求
项目结构
image.png子模块间依赖
compile project(":dao")//依赖具有传递性
公共配置
// 所有模块/项目的通用配置
allprojects {
apply plugin: 'java'//必须放最上面
sourceCompatibility = 1.8
group 'com.zyc'
version '1.0-SNAPSHOT'
}
// 子模块/项目的统一配置
subprojects {
dependencies {
compile("javax.servlet:javax.servlet-api:4.0.1")
}
}
属性扩展
参考:https://blog.csdn.net/jhl122/article/details/74171966