基于对newKP项目的快速建设,有必要对gradle进行必要的探索。方便同伴在配置gradle时少踩坑!纯手打,有任何疑问随时找我。
1.简单介绍Gradle
自动化构建工具,目前主要针对java应用。
特点:约定大于配置,支持多项目编译和多种依赖管理(Maven仓库,本地文件系统dir和jars,nexus私服、ivy仓库)
在Gradle中,有两个基本概念:项目和任务:
- 项目是指我们的构建产物(比如Jar包)或实施产物(将应用程序部署到生产环境)。一个项目包含一个或多个任务。
- 任务是指不可分的最小工作单元,执行构建工作(比如编译项目或执行测试)。
那么,这些概念和Gradle的构建又有什么联系呢?好,每一次Gradle的构建都包含一个或多个项目,每个项目又包含若干个任务。
2.Gradle三个配置文件
- Gradle构建脚本(build.gradle)指定了一个项目和它的任务。
- Gradle属性文件(gradle.properties)用来配置构建属性。
- Gradle设置文件(gradle.settings)对于只有一个项目的构建而言是可选的,如果我们的构建中包含多于一个项目,那么它就是必须的,因为它描述了哪一个项目参与构建。每一个多项目的构建都必须在项目结构的根目录中加入一个设置文件。
3.Gradle插件
gradle支持的特性都是由gradle插件 提供的,例如:
apply plugin: 'java'
apply plugin: 'com.google.protobuf'
每一个插件都提供了直接可用的任务,使用 gradle tasks命令查看可用任务列表及其描述,例如java插件:
:clean - 清理项目编译输出的build目录
:compileJava - 编译java文件
:processResources
:classes
:jar - 在build/libs目录中创建一个[project.name + version].jar文件
:compileTestJava
:processTestResources
:testClasses
:test
:check
:assemble - 打包项目
:build - 打包项目并执行所有单元测试
protobuf插件:
:extractIncludeProto - 从包含的编译依赖项中提取proto文件
:extractIncludeTestProto - 从包含的编译依赖项中提取proto文件
:extractProto - 提取由“protobuf”配置指定的proto文件/依赖关系
:extractTestProto - 提取由“protobuf”配置指定的proto文件/依赖关系
:generateProto - 编译“main”的Proto源代码
:generateTestProto - 编译Proto源代码'test'
4.Gradle打包
从上面的task看到,打包项目的任务有两个:assemble/build
> gradle assemble
:compileJava
:processResources
:classes
:jar
:assemble
BUILD SUCCESSFUL
Total time: 3.163 secs
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 3.01 secs
可以看出build和assemble的区别是,build除了执行打包所需的任务集,还会执行所有自动化测试的任务集。
5.运行打包后的项目
从图中可以看出,在build和assemble打包的任务集中,都包含了jar任务,所以在build/libs目录下可以看到已经生成了 将当前java项目打包后的jar文件。
可直接在命令行通过java -jar [jar文件名称]命令直接运行jar文件(前提是jar包中具有包含main方法的class)
$ pwd
/Users/ouxch/workspace/temp/FirstApplication/build/libs
$ ls
FirstApplication-1.0-SNAPSHOT.jar
$ java -jar FirstApplication-1.0-SNAPSHOT.jar
FirstApplication-1.0-SNAPSHOT.jar中没有主清单属性
😅运行错误,提示没有为jar指定主清单属性。
重点来了,继续往下看……
6.配置jar任务
jar文件其实是一种对文件的压缩,每一个jar包都应该包含一个manifest文件,其中包含很多属性,例如Main-Class属性,为jar包指定主类,即程序运行时的入口。
在gradle中可以对jar任务进行修改,为jar包添加必要的属性集。
通过java插件提供的Manifest接口的attributes()方法:
jar {
manifest {
attributes 'Main-Class': 'ouxch.exmaple.HelloWorld'
}
}
然后再重新编译打包运行:
$ cd build/libs/
$ java -jar FirstApplication-1.0-SNAPSHOT.jar
Hello World!