Java中主要有三大项目构建工具:Gradle、Maven和Ant,Gradle是继Maven之后的新一代构建工具,他采用基于Groovy的特定领域语言(DSL)作为脚本,相比通过XML来配置的传统构建工具(maven),最直观的感受就是脚本更加的简洁优雅
进入官网https://gradle.org/releases/,点击binary-only进行下载,然后将下载好的压缩包解压到任意位置
新建一个名为GRADLE_HOME的变量,变量值->浏览目录选择Gradle根目录
配置Path->指定Gradle的bin目录
CMD窗口输入以下命令,如果出现版本号等信息,说明安装配置成功
gradle -v
同Maven一样,Gradle也可以配置国内镜像来提升下载速度,我们打开用户目录的.gradle文件夹,创建一个init.gradle文件
allprojects {repositories {maven{ url 'http://maven.aliyun.com/repository/public/'}mavenCentral()}
}
Gradle的生命周期分为三个阶段,Initialization->Configuration->Execution
执行init.gradle和setting.gradle,init gradle文件会在每个项目build之前被调用,完成一些初始化的操作,例如:
配置内部的仓库信息(如公司的maven仓库信息)
配置全局属性
配置用户名及密码信息
Setting.gradle决定哪些项目参与到构建中,为每个项目创建一个Project
执行build.gradle文件,顺序是先执行完所有父工程的,再执行子工程的,根据脚本代码创建对应的Task,最终根据所有Task生成有向无环图
根据Configuration阶段的有向无环图,按顺序执行Task
Gradle执行的最小单元是Task,Task包含三部分的行为,分别是doFirst、doSelf、doLast
Action的执行顺序:
下面是简单的Task演示
task("task1"){print("Configuration阶段执行")doFirst {print("Execution阶段执行,且在doLast前执行")}doLast {print("Execution阶段执行")}
}
编写Task1
执行Task1
Gradle有三种引入依赖的方式,分别是本地依赖、项目依赖和直接依赖,都是在build.gradle文件中引入
implementation files("lib/fastjson-1.2.83.jar", "lib/commons-io-2.11.0.jar")
implementation fileTree('dir':'lib', includes: ['fastjson*.jar'], excludes: ['commons-io-2.11.0.jar'])
implementation project(':subProject1')
subProject1必须在settings.gradle中声明
subProject1模块通过api引入的依赖就可以传导到rootProject工程(implementation引入的不支持),rootProject就可以直接使用gson依赖了
声明格式为 依赖的类型 依赖的组名,依赖的名称,依赖的版本号
implementation group:'com.google.code.gson',name:'gson',version:'2.8.5'
上述可以简写为
implementation 'com.google.code.gson:gson:2.8.5'
依赖类型 | 说明 |
---|---|
compileOnly | java插件提供,适用于仅编译器需要而无需打包的情况,取代老版本的compile |
runtimeOnly | java插件提供,仅运行期有效,编译时不需要,比如mysql驱动包,取代老版本的runtime |
implementation | java插件提供,针对src/main目录,在编译、运行时都有效 |
testCompileOnly | java插件提供,仅测试编译时有效,运行时不需要 |
testRuntimeOnly | jjava插件提供,只在测试运行时需要,编译时不需要 |
testImplementation | java插件提供,针对src/test目录,在编译、运行时都有效 |
providedCompile | war插件提供支持,编译、测试阶段代码需要,而运行阶段容器已经提供了相应的支持,所以无需打到war包中了,例如servlet-api.jar、jsp-api.jar |
api | java-library插件提供支持,可以传递性地导出给使用者,用于编译和运行时 |
compileOnlyApi | java-library插件提供支持,在声明的模块和使用者在编译时需要的依赖项,运行时不需要 |
api与implemention的区别
在build.gradle文件中引入插件,不同的插件支持不同的依赖类型,java插件支持的,java-library插件都支持
依赖冲突指的是如果存在某一依赖的多个版本, 最终只有一个版本的依赖能打包进jar /war包,对于Gradle来说就有冲突了
spring-boot-starter-test:2.7.9包含junit-jupiter:5.8.2版本的jar,同时我引入了junit-jupiter:5.9.0版本的jar
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0'
下图中可以发现,Gradle默认会使用最新版本的 jar包(考虑到新版本的jar包一般都是向下兼容的),实际开发中也是建议使用官方自带的这种解决方案
同时Gradle还提供了一系列解决冲突的方法,例如exclude移除依赖、不允许依赖传递、强制使用某个版本
testImplementation('org.springframework.boot:spring-boot-starter-test'){exclude group:'org.junit.jupiter'// exclude module:'junit-jupiter'// exclude group:'org.junit.jupiter', module:'junit-jupiter'}
testImplementation('org.springframework.boot:spring-boot-starter-test'){transitive(false)}
此时spring-boot-starter-test所引用的包将需要我们一个个手动去引入
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0!!'