在学这个之前,我学了 Groovy ,虽然不是 Groovy 的大神,但基本的也都弄明白了
学 Gradle 之前,要理解几个关键:闭包,方法、参数调用的简写,Groovy 脚本的编写与调用等等一些概念要清楚
/** * 1、每个 gradle 文件都包含一个 Project 对象 */ /** * 2、两个重要的基本概念:项目(project),任务(task) * 每个构建至少包含一个项目,一个项目包含一个或多个任务 * 多项目构建中,可以相互依赖项目,任务也可以相互依赖 */ /** * 3、项目:一个项目代表一个正在构建的组件(jar 包 ,war 包 等) * 当构建启动后,Gradle 会根据 build.gradle 文件 实例化一个: * org.gradle.api.Project 类,并且通过 project 变量使其可以隐式可用 * 4、项目: * 4.1 重要属性:group,name( 就是 maven 中的 artficteId ),version,能确定唯一一个组件 * 4.2 重要方法:apply() repositories() dependencies() task() */ /** * 5、任务 * 任务对应于 org.gradle.api.Task 类,主要包括任务动作和任务依赖,任务是最小的工作单元,可以定义依赖于其他任务、动作序列、执行顺序 * 5.1 重要方法:doFirst() doLast() dependsOn() 其中 doLast() 可以写成 << */ /** * 6、构建的生命周期 * 1、初始化: * 首先 Gradle 根据构建脚本初始化一个或多个 project 对象,并确定他们的依赖关系 * 2、配置: * 一句话而言就是:初始化任务,详细一点就如下: * 根据配置代码生成 task 的依赖顺序 以及 执行顺序 * 什么是配置代码:除了动作代码以外的代码 * 3、执行: * 主要是执行动作代码,执行完毕后就构建完成了 * 注意: * 根据构建的生命周期来讲,配置代码在执行代码之前执行 * 因此有些配置代码不能在执行代码中执行,会报错的 * 除了上面三个生命周期,其实还有三个钩子方法,分别在初始化之后,配置之后,执行之后 */ /** * 7、依赖管理: * 意义:不必重复造轮子,解决版本冲突 * 7.1、工件坐标: * 工件可以简单的理解为 jar 包,坐标就是 group、name、version * 7.2、仓库: * 去哪里找这些依赖,常用的的仓库如下: * 这两个是公共仓库,我们可以传也可以依赖下载 * mavenCentral * jcenter * 这个是本地仓库 * mavenLocal * 自定义 maven 仓库:这个是最常用的 * 文件仓库:这个不常用,影响了到处都可构建的初衷 * 7.3、依赖的传递性 * B依赖A,C依赖B,那么C依赖A,这就是依赖的传递性,就因为这种依赖的传递性导致了版本的冲突 * 7.4、依赖管理的自动化 * 7.5、依赖管理的阶段: * 源代码阶段:编译阶段,运行阶段 * 测试代码阶段:编译阶段,运行阶段 * 其实他们阶段与阶段之间也有依赖的不同情况,例如: * 运行阶段的依赖大于等于编译阶段 * 测试阶段的编译/运行依赖大于等于源码阶段的编译/运行阶段 * 在例如:JDBC 的实现在编译阶段不需要,但在运行阶段需要 */ /** * 8、解决依赖冲突 * 1、查看依赖报告: * 只有查看了依赖报告,才会知道那些有冲突,才能针对性的解决这类问题 * 2、排除传递性依赖: * 排除传递性依赖: * compile ('org.hibernate:hibernate-core:5.2.12.Final'){ exclude(group: '', module: '', //transitive: false) } * 强制指定一个版本 * configurations.all{ * resolutionStrategy{ * force "org.hibernate:hibernate-core:5.2.12.Final" * } * } * 注意: * 当遇到版本冲突时,Gradle 会给我们指定一个最高版本,这个时候如我们不要最高版本,需要修改如下: * configurations.all{ * resolutionStrategy{ * failOnVersionConflict() * } * } * 让默认解决策略失败,用我们自己的策略 */ group 'com.caisir.gradle' version '1.0' //println("this is my print ${project}") apply plugin: 'java' apply plugin: 'war' //configurations.all{ 这样写并不正确呀 resolutionStrategy{ failOnVersionConflict() } //} //configurations.all{ 这样写并不正确呀,测试这个的时候把 L122 那行的 exclude 去掉 // resolutionStrategy{ // failOnVersionConflict() // force "dom4j:dom4j:1.6" // } //} repositories { maven { url ''// 这个是自己公司的 maven 库 } mavenLocal() //这个是本地 maven 库 mavenCentral() //http://search.maven.org/ } dependencies { compile 'dom4j:dom4j:1.6' compile ('org.hibernate:hibernate-core:5.2.12.Final'){exclude(group:"dom4j",module:"dom4j")}//当 L98 可以 build 时 重新 build 一下,查看是否 build 通过 testCompile group: 'junit', name: 'junit', version: '4.11' } def createDir = { path -> File file = new File(path) if (!file.exists()) { file.mkdirs() } } task makeJavaDir() { def paths = ['src/main/java', 'src/main/resources', 'src/main/webapp', 'src/main/caisir'] paths.forEach(createDir) //在这里也能执行 ,放到 doFirst 也能执行 doFirst { paths.forEach(createDir) //在这里也能执行 ,放到 doFirst 也能执行 } } task makeWebDir() { dependsOn "clean", "jar", "war", "makeJavaDir" def paths = ['src/test/java', 'src/test/resources', 'src/test/webapp'] doLast { paths.forEach(createDir) } } /** * 9、多项目的构建 * 降低耦合,功能边界清晰,维护方便 */
学的 有点困了,先到这了