使用gradle构建java项目(1)
gradle 是什么
gradle 是一个让构建自动化的工具,类似于maven,ant的功能.
使用gradle可以给java项目编译,单元测试,打包,或者生成可执行的jar包等
gradle的依赖环境
gradle依赖java环境,所以使用gradle前需要安装jdk 或jre
gradle 构建项目的流程
gradle的构建依赖于task,
task可以指定与其他task之间的依赖关系
比如,有两个task,walk 和bike,如果指定walk依赖bike,那么
执行walk前会先执行bike.
task的来源有两种:
- 插件提供,gradle有很多现成的插件;
- 自定义:在build.gradle 文件中声明task
生命周期
maven 的构建是通过生命周期来排列的,而 gradle 不是,它没有生命周期,它是通过任务的依赖关系来组织顺序的。
build.gradle 的执行流程
Lifecycle
There is a one-to-one relationship between a Project and a build.gradle file. During build initialisation, Gradle assembles a Project object for each project which is to participate in the build, as follows:
- Create a Settings instance for the build.
- Evaluate the settings.gradle script, if present, against the Settings object to configure it.
- Use the configured Settings object to create the hierarchy of Project instances.
- Finally, evaluate each Project by executing its build.gradle file, if present, against the project. The projects are evaluated in breadth-wise order, such that a project is evaluated before its child projects. This order can be overridden by calling Project.evaluationDependsOnChildren() or by adding an explicit evaluation dependency using Project.evaluationDependsOn(java.lang.String).
如何执行任务
方式一:使用全局命令
gradle <任务名>
方式二:使用项目中的脚本
./gradlew <任务名>
task 能实现哪些功能
下面是一些常用的基本功能
复制
task walk(description:'walk') { doLast { println 'walk...' println myName copy { into 'demo' exclude '**/.svn/**' from('README.md') } } }
删除
task walk(description:'walk') { doLast { println 'walk...' println myName project.delete { delete 'README.md' followSymlinks = true } } }
生成源码 jar 包
task sourcesJar(type: Jar) { classifier = 'sources' from sourceSets.main.allSource doFirst { manifest = defaultManifest([ project : subproj, projectVendor: project_vendor ]) } }
设置/添加依赖
使用project 下面的dependencies
see /Users/whuanghkl/.gradle/wrapper/dists/gradle-4.4-all/9br9xq1tocpiv8o6njlyu5op1/gradle-4.4/src/core-api/org/gradle/api/Project.java
void dependencies(Closure configureClosure);
dependencies 方法的参数是一个配置闭包,那么这个闭包有哪些配置呢?
maven 中的
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> <scope>compile</scope> </dependency>
等价于
compile 'commons-lang:commons-lang:2.6'
参考:https://docs.gradle.org/current/userguide/java_plugin.html#tab:configurations
https://docs.gradle.org/current/userguide/managing_dependency_configurations.html
引入本地jar包
compile project.fileTree(dir:'/Users/whuanghkl/code/mygit/myproject/target',include:['io0007-0.0.1.jar'])
依赖指定文件夹
compile project.fileTree(dir:'/Users/xx/Documents/mygit/demo/io0007/target',include:['*.jar']) compile project.fileTree(dir:'/Users/xx/Documents/mygit/demo/idea_plugin/intellij-aa-editor/lib',include:['*.jar'])
如何查询依赖的版本
直接使用 maven 仓库,那么就可以直接查询maven 仓库 :
https://mvnrepository.com/search?q=common-lang
gradle中依赖的仓库有多种:
参考:https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html
我们可以选择 maven仓库:
repositories { mavenCentral() }
也可以使用本地的 maven 仓库:
repositories { mavenLocal() }
甚至可以直接指定依赖的 jar 包目录:
maven { url "lib" }
那么 查询依赖就和maven一样了 .
gradle的插件有哪些
参考 https://docs.gradle.org/current/userguide/userguide.html
springboot 项目生成可执行的jar包
我的项目是spring boot,所以需要引入插件'org.springframework.boot' id 'org.springframework.boot' version '2.0.4.RELEASE'
需要在build.gradle 文件中 指定可执行jar的main class :
jar { manifest { attributes 'Main-Class': 'com.kunlunsoft.Application' } }
执行任务bootJar 就可以生成可执行的jar包
gradle 与maven相比有哪些优势
- 功能更强大,可以很方便的自定义任务;
- 添加依赖更简洁方便;
- 任务的执行流程更灵活,不像maven的生命周期那么固定.
- 可以编写 groovy 代码,我们知道 groovy 是非常灵活的。
参考
https://my.oschina.net/huangweiindex/blog/1844872
https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.DependencyHandler.html
https://docs.gradle.org/current/userguide/java_plugin.html#tab:configurations
我项目中完整的build.gradle 文件如下:
plugins { id 'java' id 'base' id 'org.springframework.boot' version '2.0.3.RELEASE' } group 'com.kunlunsoft' version '1.0.0-SNAPSHOT' sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } jar { manifest { attributes 'Main-Class': 'com.kunlunsoft.Application' } } task walk(description:'walk') { doLast { println 'walk...' } } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' testCompile("org.springframework.boot:spring-boot-starter-test") //数据源 compile 'org.springframework.boot:spring-boot-starter:1.5.14.RELEASE' compile 'org.springframework.boot:spring-boot-starter-web:1.5.14.RELEASE' compile 'org.springframework.boot:spring-boot-starter-data-redis:1.5.14.RELEASE' compile 'mysql:mysql-connector-java:5.1.38' compile project.fileTree(dir:'/Users/whuanghkl/code/myproject/target',include:['io0007-0.0.1-SNAPSHOT.jar']) compile 'com.google.guava:guava:23.0-rc1' compile 'org.apache.commons:commons-email:1.5' compile 'org.codehaus.jackson:jackson-mapper-lgpl:1.9.12' //redis // compile 'org.springframework.data:spring-data-redis:1.8.13.RELEASE' compile 'redis.clients:jedis:2.9.0' compile 'org.springframework.statemachine:spring-statemachine-core:1.2.0.RELEASE' compile 'com.alibaba:fastjson:1.2.47' //配置mybatis compile "org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1" compile 'org.springframework.boot:spring-boot-gradle-plugin:1.5.14.RELEASE' // compile 'org.springframework:springloaded:1.5.14.RELEASE' }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
设计模式-观察者模式
我的理解 很久之前有个老师给我们讲观察者模式时,举了一个例子:妈妈照顾婴儿,他们在不同的房间,婴儿在婴儿房间A,妈妈在书房M,为了保证婴儿睡醒之后能及时得到照顾,妈妈每隔10分钟就去房间A瞧瞧,看看婴儿是否醒了.妈妈为了防止忘记,给自己定了一个闹钟,每隔10分钟响一次. while (10分钟之后) { watchBaby();//检查婴儿是否睡醒 } 一段时间之后,妈妈觉得很累,而且效率很低,因为很多次妈妈去照看婴儿时,发现婴儿在睡觉啥事也没有. 后来,妈妈发现了一个好方法,在婴儿身上寄一个铃铛,婴儿只要一动,铃铛就会响,妈妈就能听到.这样妈妈就可以安心工作了,只要听到铃铛响就跑过去照看下. 关系图: 其实上面的例子涉及到两种模式: 妈妈每隔10分钟主动去查看 是轮询模式; 妈妈不用主动去检查,婴儿醒了,妈妈就会听到铃铛, 是观察者模式 那种模式效率更高呢?一般情况下,观察者模式效率更高,轮询,每隔一段时间去查看,浪费了资源. 观察者模式的角色 有如下角色:观察者,被观察者,事件,有如下操作:注册,通知 观察者 案例中的妈妈就是观察者,她观察婴儿,看它醒了没有,有什么需求 被观察者 ...
- 下一篇
springboot + aop + Lua分布式限流的最佳实践
一、什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了限流!因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤、列车的超载,存在一定的安全隐患。同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃。为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间。限流是保证系统高可用的重要手段!!! 由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动,为了保证系统不被巨大的流量压垮,会在系统流量到达一定阈值时,拒绝掉一部分流量。 限流会导致用户在短时间内(这个时间段是毫秒级的)系统不可用,一般我们衡量系统处理能力的指标是每秒的QPS或者TPS,假设系统每秒的流量阈值是1000,理论上一秒内有第1001个请求进来时,那么这个请求就会被限流。 二、限流方案 1、计数器 Java内部也可以通过原子类计数器AtomicInteger、Semaphore信号量来做简单的限流。 // 限流的个数 private int maxCount = 10; // ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启