一、基本介绍
Gradle是开源的构建项目工具,跟maven一样但是比maven更加的灵活可扩展,因为gradle可以通过写groovy脚本来完成项目的构建,Maven我们都知道通过xml来配置,gradle只需要通过写groovy脚本比如在写插件的时候gradle只需要简短的几行代码就可以完成。但是自由是有代价的,而且groovy是一门另外的语言,相比xml门槛更高。
1.1 特性
约定配置
Gradle提供了一些默认的Tasks给Java项目,比如,编译源代码、运行测试、打包JAR.每一个Java项目都有一个标准的路径布局,这个布局定义了去哪里找项目的源代码、资源文件和测试代码,你也可以在配置中修改这些默认位置。
Gradle的约定类似于Maven的约定优于配置的实现,Maven的约定就是一个项目只包含一个Java源代码路径,只产生一个JAR文件,对于企业级开发来讲这样是显然不够的,Gradle允许你打破传统的观念,Gradle的构建生命周期如下图:

1.2 迁移到Gradle
Ant迁移
现有的Ant脚本可以无缝的导入到Gradle项目中,Ant的Target在运行时直接映射成Gradle的任务,Gradle有一个AntBuilder可以把你的Ant脚本混成Gradle的DSL(领域特定语言),这些脚本看起来像是Ant的XML,但是去掉了尖括号,对于Ant用户来说非常方便,不需要担心过渡到Gradle的学习周期。
Maven迁移
使用Maven依赖
Gradle能够解析现有的Maven POM,从而得到传递性依赖的信息,并且引入到当前项目中,在此基础上,它也支持排除传递性依赖或者干脆关闭传递性依赖,这一点是Maven所不具备的特性。
构建Maven依赖
使用Gradle的Maven Plugin,用户就可以轻松地将项目构件上传到Maven仓库中:
apply plugin: 'maven' ... uploadArchives { repositories.mavenDeployer { repository(url: "http://localhost:8088/nexus/content/repositories/snapshots/") { authentication(userName: "admin", password: "admin123") pom.groupId = "com.juvenxu" pom.artifactId = "account-captcha" } } }
复制
在上传的过程中,Gradle能够基于build.gradle生成对应的Maven POM文件,用户可以自行配置POM信息,比如这里的groupId和artifactId,而诸如依赖配置这样的内容,Gradle是会自动帮你进行转换的。由于Maven项目之间依赖交互的直接途径就是仓库,而Gradle既能够使用Maven仓库,也能以Maven的格式将自己的内容发布到仓库中,因此从技术角度来说,即使在一个基于Maven的大环境中,局部使用Gradle也几乎不会是一个问题。
1.3 工具对比
Ant
Ant 是 Apache 组织下的一个跨平台的项目构建工具,它是一个基于任务和依赖的构建系统,是过程式的。开发者需要显示的指定每一个任务,每个任务包含一组由 XML 编码的指令,必须在指令中明确告诉 Ant 源码在哪里,结果字节码存储在哪里,如何将这些字节码打包成 JAR 文件。Ant 没有生命周期,你必须定义任务和任务之间的依赖,还需要手工定义任务的执行序列和逻辑关系。这就无形中造成了大量的代码重复。
maven
Maven 是 Apache 组织下的一个跨平台的项目管理工具,它主要用来帮助实现项目的构建、测试、打包和部署。Maven 提供了标准的软件生命周期模型和构建模型,通过配置就能对项目进行全面的管理。它的跨平台性保证了在不同的操作系统上可以使用相同的命令来完成相应的任务。Maven 将构建的过程抽象成一个个的生命周期过程,在不同的阶段使用不同的已实现插件来完成相应的实际工作,这种设计方法极大的避免了设计和脚本编码的重复,极大的实现了复用。
Maven 不仅是一个项目构建工具还是一个项目管理工具。它有约定的目录结构和生命周期,项目构建的各阶段各任务都由插件实现,开发者只需遵照约定的目录结构创建项目,再配置文件中生命项目的基本元素,Maven 就会按照顺序完成整个构建过程。Maven 的这些特性在一定程度上大大减少了代码的重复。
Gradle
Gradle的出现满足了很多现在构建工具的需求,Gradle提供了一个DSL(领域特定语言),一个约定优于配置的方法,还有更强大的依赖管理,Gradle使得我们可以抛弃XML的繁琐配置,引入动态语言Groovy来定义你的构建逻辑。
二、安装环境
2.1 jdk安装
已安装 JDK/JRE(版本 7 或以上),安装过程略…
2.2 gradle安装
下载zip
官方发行本是一个ZIP包解压即可
配置环境变量
运行 gradle 必须将GRADLE_HOME/bin
加入到你的 PATH 环境变量中。 GRADLE_HOME
为gradle的安装目录,类似JAVA_HOME和MAVEN_HOME不再赘述。
#查看版本信息
gradle -v
复制
三、Java项目构建
3.1 初始化gradle
#使用java模板
gradle init
复制
3.2 Spring项目构建示例
buildscript { // 配置变量 ext { springBootVersion = '2.7.11' } // 插件仓库 repositories { maven { url "https://maven.aliyun.com/repository/gradle-plugin" } maven { url "https://maven.aliyun.com/repository/spring-plugin" } gradlePluginPortal() } // 应用插件需要的依赖包 dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } plugins { //idea插件,用来生成idea工程目录 id 'idea' //java插件,提供build、jar等task id 'java' //maven发布插件,提供publish等task id 'maven-publish' } //spring boot插件提供bootrun等task apply plugin: 'org.springframework.boot' //dependency-management插件,为spring版本项目提供一致的版本号 apply plugin: 'io.spring.dependency-management' //依赖镜像 repositories { maven { url 'https://maven.aliyun.com/repository/central' } maven { url 'https://maven.aliyun.com/repository/public' } } //jar包发布 publishing { publications { app(MavenPublication) { from components.java //发布归档jar包,内部是编译后class文件,app-1.0.0-plain.jar //版本映射策略 versionMapping { usage('java-api') { fromResolutionOf('runtimeClasspath') } usage('java-runtime') { fromResolutionResult() } } } } repositories { //发布到本地仓库,默认是路径$USER_HOME/.m2/repository mavenLocal() //本项目build目录 maven { name 'localBuildRepo' def releasesRepoUrl = layout.buildDirectory.dir('repos/releases') def snapshotsRepoUrl = layout.buildDirectory.dir('repos/snapshots') url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl } //本地自定义路径repo maven { name 'myRepo' url = layout.projectDirectory.dir('D:\\jenviorment\\apache-maven-3.8.6\\repo') } //远端私有仓库repo maven { name 'huawei-cloud' def releasesRepoUrl = 'https://devrepo.devcloud.cn-north-4.huaweicloud.com/artgalaxy/cn-north-4_28e3db20d17644c1b392216ca50a185d_maven_1_0/' def snapshotsRepoUrl = 'https://devrepo.devcloud.cn-north-4.huaweicloud.com/artgalaxy/cn-north-4_28e3db20d17644c1b392216ca50a185d_maven_2_0/' url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl credentials { username 'xxx' password 'xxx' } } //发布到maven中央仓库,需要申请中央仓库的账号 mavenCentral() } } //指定构建输出目录 buildDir = './build' //指定包信息 group = 'org.xrj' version = '1.0.0' //java 版本 sourceCompatibility = 1.8 targetCompatibility = 1.8 //编译字符集 tasks.withType(JavaCompile).configureEach { options.encoding = 'utf-8' } //项目依赖 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.session:spring-session-data-redis' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'mysql:mysql-connector-java:8.0.31' compileOnly "org.projectlombok:lombok" testCompileOnly "org.projectlombok:lombok" testImplementation "org.springframework.boot:spring-boot-starter-test" runtimeOnly 'org.springframework.boot:spring-boot-devtools' }
复制