
“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/
為了和項目版本一緻,我就下載下傳:gradle-4.7-bin.zip這個了。
解壓好後的目錄
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是弱類型,groovy會根據情況來指派的類型def i = 18println i+1def s = "小明"println s+1//Groovy中定義複雜變量//定義集合類型,注意這裡單雙引号都是一個效果def list = ['a',"b"]//往list中添加元素list << 'c'//取出第三個元素println list.get(2)//定義一個mapdef map = ['key1':'value1','key2':'value2']//向map中添加鍵值對map.key3 = 'value3'//列印key3的值println map.get('key3')
結果
hello Groovyhello Groovyhello Groovyhello Groovy19小明1cvalue3
好的,簡單的說完了,我們再講個groovy中的閉包(類似Java中的函數式程式設計)
無參數閉包調用
//Groovy中的閉包//閉包其實是一段代碼塊。在閉包中,我們主要把閉包當參數來使用//定義一個閉包def b1 = { println "hello b1"}//定義一個方法,方法裡面需要閉包類型的參數def method1(Closure closure){ closure()}//調用method1method1(b1)
結果
hello b1
有參數的閉包調用
//定義一個閉包,帶參數def b2 = { v -> println "hello ${v}"}//定義一個方法,方法裡面需要閉包類型的參數def method2(Closure closure){ closure("小pw")}//調用method2method2(b2)
輸出
hello 小pw
06
—
Gradle配置檔案
接下來我們看下Gradle配置檔案以及如何使用。
打開build.gradle檔案如下
這裡做一個注解
//目前項目運作環境plugins { id 'java'}//項目的坐标group 'cn.pw'version '1.0-SNAPSHOT'//指定倉庫的路徑//mavenCentral()預設隻使用遠端中央倉庫去拉取jar包,下載下傳到我們指定的本地倉庫repositories { mavenCentral()}//gradle中所有的jar包的坐标都在dependencies屬性内放置//每個jar包的坐标有三個基本元素對應Maven中的坐标//group name version//testCompile表示該jar包在測試時起作用//我們在gradle添加坐标時都要帶上jar包的作用域dependencies { testCompile group: 'junit', name: 'junit', version: '4.12'}
然後假如我們要使用spring的jar包,過程應該如下。
先去maven中央倉庫位址:https://mvnrepository.com/
搜尋spring,選取spring framework
選取版本
選取gradle
下面的内容就是gradle的坐标格式了,複制粘貼到build.gradle中就好。
OK,這樣一個依賴就加好了。
07
—
Gradle使用Maven倉庫
從groovy文法可以知道,其實配置檔案中的内容都是方法,比如mavenCentral(),我們按住ctrl點選進去,可以看到類和方法,和java一樣。
我們看到其中有一個方法是mavenLocal(),這個方法就是調用本地倉庫去拉取jar包,是以我們可以在代碼中作如下更改。
//指定倉庫的路徑//mavenCentral()預設隻使用遠端中央倉庫去拉取jar包,下載下傳到我們指定的本地倉庫repositories { //先去本地倉庫拉取Jar包 mavenLocal() //本地倉庫拉取不到去中央倉庫拉取Jar包 mavenCentral()}
這樣,我們就可以先使用Maven本地倉庫的Jar包啦。
08
—
Gradle建構Jar工程
上代碼測試
build.gradle
//目前項目運作環境plugins { id 'java'}//項目的坐标group 'cn.pw'version '1.0-SNAPSHOT'//指定倉庫的路徑//mavenCentral()預設隻使用遠端中央倉庫去拉取jar包,下載下傳到我們指定的本地倉庫repositories { //先去本地倉庫拉取Jar包 mavenLocal() //本地倉庫拉取不到去中央倉庫拉取Jar包 mavenCentral()}//解決gradle控制台亂碼的問題tasks.withType(JavaCompile) { options.encoding = "UTF-8"}//gradle中所有的jar包的坐标都在dependencies屬性内放置//每個jar包的坐标有三個基本元素對應Maven中的坐标//group name version//testCompile表示該jar包在測試時起作用//我們在gradle添加坐标時都要帶上jar包的作用域dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' // https://mvnrepository.com/artifact/org.springframework/spring compile group: 'org.springframework', name: 'spring', version: '2.5.6'}
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{ @Override public List findAll() { LinkedList stringLinkedList = 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 { @Test public void gradlejarTest() { //得到Spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); //從容器中拿對象 gradleDao gradleDao = (cn.pw.gradleDao) applicationContext.getBean("gradleDao"); //對象執行方法 gradleDao.findAll(); }}
啟動參數
-Dfile.encoding=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@53500d47: display name [org.springframework.context.support.ClassPathXmlApplicationContext@53500d47]; startup date [Fri Jun 26 01:41:10 GMT+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@53500d47]: org.springframework.beans.factory.support.DefaultListableBeanFactory@65f56674六月 26, 2020 1:41:11 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons資訊: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@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 ':test --tests "GradleJarTest.gradlejarTest" -Dfile.encoding=utf-8'.
打Jar包
輸出
上午 1:42:19: Executing task 'jar'...> 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 'jar'.
jar包位置
09
—
Gradle建構War工程
web工程建立和jar是一樣的,隻是需要自己在src下建立webapp以及在build.gradle中添加war包類型即可。
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="3.0"> <servlet> <servlet-name>springmvcservlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> <init-param> <param-name>contextConfigLocationparam-name> <param-value>classpath:springmvc.xmlparam-value> init-param> servlet> <servlet-mapping> <servlet-name>springmvcservlet-name> <url-pattern>/url-pattern> servlet-mapping>web-app>
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="cn.pw.controller"/> <mvc:annotation-driven/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> bean> <mvc:default-servlet-handler/>beans>
controller
package cn.pw.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@[email protected]("hello")public class HelloController { @RequestMapping("index") public String toindex(){ return "index"; }}
index.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %><html><body><jsp:forward page="hello/index"/>body>html>
index.jsp
<html><body><h2>Hello World!h2>body>html>
本機 tomcat啟動後的輸出
打war包
10
—
Gradle建構聚合工程
聚合工程是最重要的,因為一般項目裡都會是這個模式,類似于Maven的聚合,也是由Parent管理子子產品的共性Jar包。具體如何建立我們來看下。
首先建立父工程和一般的項目一樣。
然後對着項目右鍵newModule,操作差不多,改個名字就好。
出現子項目,且在父工程的settings.gradle檔案中包含子子產品資訊。
如法再建一個web
我們将web還是變成war工程
再建立一個service
把之前的web工程的配置都拷貝過來。
然後開始導jar包,這裡共同jar包要放到父工程中,添加allprojects标簽。
父工程build.gradle
allprojects { apply plugin: 'java' group 'cn.pw' version '1.0-SNAPSHOT' repositories { mavenLocal() mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12'// https://mvnrepository.com/artifact/org.springframework/spring compile group: 'org.springframework', name: 'spring', version: '5.2.0.RELEASE', ext: 'pom' // https://mvnrepository.com/artifact/org.springframework/spring-web compile group: 'org.springframework', name: 'spring-web', version: '5.0.2.RELEASE'// https://mvnrepository.com/artifact/org.springframework/spring-webmvc compile group: 'org.springframework', name: 'spring-webmvc', version: '5.0.2.RELEASE' }}
然後去除子子產品中相同的配置項比如daoProject
這些父工程都有,可以先清掉,以後有個性化配置可以給每個子工程自己的build.gradle裡面加,和Maven類似。
serviceProject需要引入daoProject的坐标。
dependencies { compile project(":daoProject")}
webProject則需要保留打war包的配置和serviceProject坐标引入,以及serverlet坐标
apply plugin: 'war'dependencies { compile project(":serviceProject") // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'// https://mvnrepository.com/artifact/javax.servlet/jsp-api providedCompile group: 'javax.servlet', name: 'jsp-api', version: '2.0'}
配置完畢,把之前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;@[email protected]("hello")public class HelloController { @Autowired private HelloSerivce helloService; @RequestMapping("index") public String toindex(Model model){ String hello = 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;@Servicepublic class HelloServiceImpl implements HelloSerivce { @Autowired private HelloDao helloDao; @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;@Repositorypublic class HelloDaoImpl implements HelloDao { @Override public String sayHello() { return "Moudle Hello"; }}
用tomcat把web跑起來後頁面如圖
如果想打包,對着parent去build就可以啦
OK,今天就分享到這裡啦~
項目源碼:
https://github.com/pengwenqq/studyDemo