“Gradle介绍*Gradle安装*Gradle项目创建注意事项*Gradle项目目录结构*Groovy简单语法*Gradle配置文件*Gradle使用Maven仓库*Gradle构建Jar工程*Gradle构建War工程*Gradle构建聚合工程”
最近的项目需要使用Gradle构建,初上手时也是一脸懵逼。不过没关系呀,咱们课余时间可以好好学习一下呀~
01
—
Gradle介绍
先上官网:https://gradle.org/
Gradle弥补Maven的不足:
Maven两个功能:1.管理Jar包。2.构建项目。
在管理jar包中,我们都知道Maven是在pom.xml中以坐标的形式去管理,一般一个Jar包的引用至少需要占两行代码以上(version可以统一管理)。虽然一般微服务的项目Jar包会相对较少,但依然会有40行往上的代码,切看起来不直观,更别说一些巨石项目了(找一个坐标要翻很久)。Gradle借用Groovy弥补了这个特性,使咱们Jar包依赖的代码更简洁且增加了编程容错性,同时由于Groovy的编程语言特性,他可以生成文件,因此也可以利用Gradle在构建时生成POM,对持物集成和服务器更友好。
02
—
Gradle安装
官方下载地址:https://services.gradle.org/distributions/
解压好后的目录
bin目录下
第一个是sh脚本,第二个是windows的执行脚本。
所以这里是我们配置环境变量的目录。
配置环境变量的操作都是相同的。
cmd里执行gradle -v ,出现类似如下信息,就说明gradle可以使用了。
第一次启动时会在C:\Users\Administrator出现.gradle的文件夹,这个就是类似Maven的.m2文件夹。
Caches文件夹作为Gradle默认的本地仓库去存储Jar包。
03
—
Gradle项目创建注意事项
接下来我们用idea创建一个最简单的Gradle管理项目看一下其项目结构。
进入Idea初始界面,先看看是否可以配置Gradle的默认使用。
发现只能配置Gradle的仓库位置,并不能确定版本,那就先不设置了。
还是回到首页先创建Gradle项目
finish创建Gradle项目。
进去之后是这个样子。
我们要设置一下使用Gradle的版本。
默认使用.gradle作为默认仓库,同时使用版本读取gradle-wrapper.properties,下面是文件内容
文件的意思是会先去读取系统变量中的%Gradle_User_Home%作为发布包/打压缩包地址,/wrapper/dists作为Gradle的下载目录,同时默认使用的是gradle6.1版本。
我们作个性化设置。
使用Maven的仓库并且使用Gradle4.7。
但是这里要注意一个问题,此处设置了默认仓库只是针对Idea的,如果我们想在自己在cmd中编译打包等操作也用我们指定的仓库时,需要在系统变量中添加如下配置。
OK,这些基本配置好后就可以开始玩Gradle了。
04
—
Gradle项目目录结构
可以看到项目里是没有Pom文件的,相对的会有一个build.gradle以及settings.gradle。另外还会有一个专门的gradle文件包,目前里面只装了wrapper(包装者?)里面的配置我们上面有贴出来。项目主体src下的内容和Maven创建时没有什么不同。
05
—
Groovy简单语法
这里先不说这些配置文件里面的内容,因为这里面的内容都是用Groovy语言编写的,先大概了解了语言我们才能明白配置文件里写了什么。
看到其结合语言就知道,Groovy是追求容错低的弱语言。
Groovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程。
大概先看这些了解一下,我们这里追求快速了解哈。
先使用Idea默认的Groovy控制台来编写代码,直接上代码和结果了。
代码
//介绍Groovy//支持Java语言编程System.out.println("hello Groovy");//Groovy自己的编程方式println("hello Groovy");//Groovy可以省略末尾分号println("hello Groovy")//Groovy可以省略末尾分号println "hello Groovy"//Groovy中定义简单变量//def是弱类型&#xff0c;groovy会根据情况来赋值的类型def i &#61; 18println i&#43;1def s &#61; "小明"println s&#43;1//Groovy中定义复杂变量//定义集合类型,注意这里单双引号都是一个效果def list &#61; [&#39;a&#39;,"b"]//往list中添加元素list <<&#39;c&#39;//取出第三个元素println list.get(2)//定义一个mapdef map &#61; [&#39;key1&#39;:&#39;value1&#39;,&#39;key2&#39;:&#39;value2&#39;]//向map中添加键值对map.key3 &#61; &#39;value3&#39;//打印key3的值println map.get(&#39;key3&#39;)
结果
hello Groovyhello Groovyhello Groovyhello Groovy19小明1cvalue3
好的&#xff0c;简单的说完了&#xff0c;我们再讲个groovy中的闭包(类似Java中的函数式编程)
无参数闭包调用
//Groovy中的闭包//闭包其实是一段代码块。在闭包中&#xff0c;我们主要把闭包当参数来使用//定义一个闭包def b1 &#61; { println "hello b1"}//定义一个方法&#xff0c;方法里面需要闭包类型的参数def method1(Closure closure){ closure()}//调用method1method1(b1)
结果
hello b1
有参数的闭包调用
//定义一个闭包&#xff0c;带参数def b2 &#61; { v -> println "hello ${v}"}//定义一个方法&#xff0c;方法里面需要闭包类型的参数def method2(Closure closure){ closure("小pw")}//调用method2method2(b2)
输出
hello 小pw
06
—
Gradle配置文件
接下来我们看下Gradle配置文件以及如何使用。
打开build.gradle文件如下
这里做一个注解
//当前项目运行环境plugins { id &#39;java&#39;}//项目的坐标group &#39;cn.pw&#39;version &#39;1.0-SNAPSHOT&#39;//指定仓库的路径//mavenCentral()默认只使用远程中央仓库去拉取jar包&#xff0c;下载到我们指定的本地仓库repositories { mavenCentral()}//gradle中所有的jar包的坐标都在dependencies属性内放置//每个jar包的坐标有三个基本元素对应Maven中的坐标//group name version//testCompile表示该jar包在测试时起作用//我们在gradle添加坐标时都要带上jar包的作用域dependencies { testCompile group: &#39;junit&#39;, name: &#39;junit&#39;, version: &#39;4.12&#39;}
然后假如我们要使用spring的jar包&#xff0c;过程应该如下。
先去maven中央仓库地址&#xff1a;https://mvnrepository.com/
搜索spring&#xff0c;选取spring framework
选取版本
选取gradle
下面的内容就是gradle的坐标格式了&#xff0c;复制粘贴到build.gradle中就好。
OK&#xff0c;这样一个依赖就加好了。
07
—
Gradle使用Maven仓库
从groovy语法可以知道&#xff0c;其实配置文件中的内容都是方法&#xff0c;比如mavenCentral()&#xff0c;我们按住ctrl点击进去&#xff0c;可以看到类和方法&#xff0c;和java一样。
我们看到其中有一个方法是mavenLocal()&#xff0c;这个方法就是调用本地仓库去拉取jar包&#xff0c;因此我们可以在代码中作如下更改。
//指定仓库的路径//mavenCentral()默认只使用远程中央仓库去拉取jar包&#xff0c;下载到我们指定的本地仓库repositories { //先去本地仓库拉取Jar包 mavenLocal() //本地仓库拉取不到去中央仓库拉取Jar包 mavenCentral()}
这样&#xff0c;我们就可以先使用Maven本地仓库的Jar包啦。
08
—
Gradle构建Jar工程
上代码测试
build.gradle
//当前项目运行环境plugins { id &#39;java&#39;}//项目的坐标group &#39;cn.pw&#39;version &#39;1.0-SNAPSHOT&#39;//指定仓库的路径//mavenCentral()默认只使用远程中央仓库去拉取jar包&#xff0c;下载到我们指定的本地仓库repositories { //先去本地仓库拉取Jar包 mavenLocal() //本地仓库拉取不到去中央仓库拉取Jar包 mavenCentral()}//解决gradle控制台乱码的问题tasks.withType(JavaCompile) { options.encoding &#61; "UTF-8"}//gradle中所有的jar包的坐标都在dependencies属性内放置//每个jar包的坐标有三个基本元素对应Maven中的坐标//group name version//testCompile表示该jar包在测试时起作用//我们在gradle添加坐标时都要带上jar包的作用域dependencies { testCompile group: &#39;junit&#39;, name: &#39;junit&#39;, version: &#39;4.12&#39; // https://mvnrepository.com/artifact/org.springframework/spring compile group: &#39;org.springframework&#39;, name: &#39;spring&#39;, version: &#39;2.5.6&#39;}
dao
package cn.pw;import java.util.List;public interface gradleDao { public List findAll();}
daoImpl
package cn.pw;import java.util.LinkedList;import java.util.List;public class gradleDaoImpl implements gradleDao{ &#64;Override public List findAll() { LinkedList stringLinkedList &#61; new LinkedList<>(); stringLinkedList.add("hello World"); System.out.println("列表查询成功"); return stringLinkedList; }}
test
import cn.pw.gradleDao;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class GradleJarTest { &#64;Test public void gradlejarTest() { //得到Spring容器 ApplicationContext applicationContext &#61; new ClassPathXmlApplicationContext("bean.xml"); //从容器中拿对象 gradleDao gradleDao &#61; (cn.pw.gradleDao) applicationContext.getBean("gradleDao"); //对象执行方法 gradleDao.findAll(); }}
启动参数
-Dfile.encoding&#61;utf-8
输出
Testing started at 上午 1:41 ...> Task :compileJava UP-TO-DATE> Task :processResources> Task :classes> Task :compileTestJava> Task :processTestResources NO-SOURCE> Task :testClasses> Task :test六月 26, 2020 1:41:10 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext&#64;53500d47: display name [org.springframework.context.support.ClassPathXmlApplicationContext&#64;53500d47]; startup date [Fri Jun 26 01:41:10 GMT&#43;08:00 2020]; root of context hierarchy六月 26, 2020 1:41:10 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [bean.xml]六月 26, 2020 1:41:11 上午 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext&#64;53500d47]: org.springframework.beans.factory.support.DefaultListableBeanFactory&#64;65f56674六月 26, 2020 1:41:11 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory&#64;65f56674: defining beans [gradleDao]; root of factory hierarchy列表查询成功BUILD SUCCESSFUL in 2s4 actionable tasks: 3 executed, 1 up-to-date上午 1:41:11: Task execution finished &#39;:test --tests "GradleJarTest.gradlejarTest" -Dfile.encoding&#61;utf-8&#39;.
打Jar包
输出
上午 1:42:19: Executing task &#39;jar&#39;...> Task :compileJava UP-TO-DATE> Task :processResources> Task :classes> Task :jar UP-TO-DATEBUILD SUCCESSFUL in 0s3 actionable tasks: 1 executed, 2 up-to-date上午 1:42:20: Task execution finished &#39;jar&#39;.
jar包位置
09
—
Gradle构建War工程
web工程创建和jar是一样的&#xff0c;只是需要自己在src下创建webapp以及在build.gradle中添加war包类型即可。
web.xml
springmvc.xml
controller
package cn.pw.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;&#64;Controller&#64;RequestMapping("hello")public class HelloController { &#64;RequestMapping("index") public String toindex(){ return "index"; }}
index.jsp
<%&#64; page contentType&#61;"text/html; charset&#61;UTF-8" language&#61;"java" %>
index.jsp
Hello World!h2>body>html>
本机 tomcat启动后的输出
打war包
10
—
Gradle构建聚合工程
聚合工程是最重要的&#xff0c;因为一般项目里都会是这个模式,类似于Maven的聚合&#xff0c;也是由Parent管理子模块的共性Jar包。具体如何创建我们来看下。
首先创建父工程和一般的项目一样。
然后对着项目右键newModule,操作差不多&#xff0c;改个名字就好。
出现子项目&#xff0c;且在父工程的settings.gradle文件中包含子模块信息。
如法再建一个web
我们将web还是变成war工程
再创建一个service
把之前的web工程的配置都拷贝过来。
然后开始导jar包&#xff0c;这里共同jar包要放到父工程中&#xff0c;添加allprojects标签。
父工程build.gradle
allprojects { apply plugin: &#39;java&#39; group &#39;cn.pw&#39; version &#39;1.0-SNAPSHOT&#39; repositories { mavenLocal() mavenCentral() } dependencies { testCompile group: &#39;junit&#39;, name: &#39;junit&#39;, version: &#39;4.12&#39;// https://mvnrepository.com/artifact/org.springframework/spring compile group: &#39;org.springframework&#39;, name: &#39;spring&#39;, version: &#39;5.2.0.RELEASE&#39;, ext: &#39;pom&#39; // https://mvnrepository.com/artifact/org.springframework/spring-web compile group: &#39;org.springframework&#39;, name: &#39;spring-web&#39;, version: &#39;5.0.2.RELEASE&#39;// https://mvnrepository.com/artifact/org.springframework/spring-webmvc compile group: &#39;org.springframework&#39;, name: &#39;spring-webmvc&#39;, version: &#39;5.0.2.RELEASE&#39; }}
然后去除子模块中相同的配置项比如daoProject
这些父工程都有&#xff0c;可以先清掉&#xff0c;以后有个性化配置可以给每个子工程自己的build.gradle里面加&#xff0c;和Maven类似。
serviceProject需要引入daoProject的坐标。
dependencies { compile project(":daoProject")}
webProject则需要保留打war包的配置和serviceProject坐标引入&#xff0c;以及serverlet坐标
apply plugin: &#39;war&#39;dependencies { compile project(":serviceProject") // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api providedCompile group: &#39;javax.servlet&#39;, name: &#39;javax.servlet-api&#39;, version: &#39;3.0.1&#39;// https://mvnrepository.com/artifact/javax.servlet/jsp-api providedCompile group: &#39;javax.servlet&#39;, name: &#39;jsp-api&#39;, version: &#39;2.0&#39;}
配置完毕&#xff0c;把之前jar工程和war工程的代码贴过来跑吧~
web
web改一下springmvc.xml
controller
package cn.pw.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import cn.pw.service.HelloSerivce;&#64;Controller&#64;RequestMapping("hello")public class HelloController { &#64;Autowired private HelloSerivce helloService; &#64;RequestMapping("index") public String toindex(Model model){ String hello &#61; helloService.sayHello(); model.addAttribute("hello",hello); return "index"; }}
service
Helloservice
package cn.pw.service;public interface HelloSerivce { public String sayHello();}
HelloserviceImpl
package cn.pw.service.impl;import cn.pw.service.HelloSerivce;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import cn.pw.HelloDao;&#64;Servicepublic class HelloServiceImpl implements HelloSerivce { &#64;Autowired private HelloDao helloDao; &#64;Override public String sayHello() { return helloDao.sayHello(); }}
dao
HelloDao
package cn.pw;public interface HelloDao { public String sayHello();}
HelloDaoImpl
package cn.pw;import org.springframework.stereotype.Repository;&#64;Repositorypublic class HelloDaoImpl implements HelloDao { &#64;Override public String sayHello() { return "Moudle Hello"; }}
用tomcat把web跑起来后页面如图
如果想打包&#xff0c;对着parent去build就可以啦
OK&#xff0c;今天就分享到这里啦~
项目源码&#xff1a;
https://github.com/pengwenqq/studyDemo