天天看點

gradle 項目打包成多個jar包_快速上手Gradle

gradle 項目打包成多個jar包_快速上手Gradle

“Gradle介紹*Gradle安裝*Gradle項目建立注意事項*Gradle項目目錄結構*Groovy簡單文法*Gradle配置檔案*Gradle使用Maven倉庫*Gradle建構Jar工程*Gradle建構War工程*Gradle建構聚合工程”

最近的項目需要使用Gradle建構,初上手時也是一臉懵逼。不過沒關系呀,咱們課餘時間可以好好學習一下呀~

01

Gradle介紹

先上官網:https://gradle.org/

gradle 項目打包成多個jar包_快速上手Gradle

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 項目打包成多個jar包_快速上手Gradle

為了和項目版本一緻,我就下載下傳:gradle-4.7-bin.zip這個了。

解壓好後的目錄

gradle 項目打包成多個jar包_快速上手Gradle

bin目錄下

gradle 項目打包成多個jar包_快速上手Gradle

第一個是sh腳本,第二個是windows的執行腳本。

是以這裡是我們配置環境變量的目錄。

配置環境變量的操作都是相同的。

gradle 項目打包成多個jar包_快速上手Gradle
gradle 項目打包成多個jar包_快速上手Gradle

cmd裡執行gradle -v ,出現類似如下資訊,就說明gradle可以使用了。

gradle 項目打包成多個jar包_快速上手Gradle

第一次啟動時會在C:\Users\Administrator出現.gradle的檔案夾,這個就是類似Maven的.m2檔案夾。

gradle 項目打包成多個jar包_快速上手Gradle

Caches檔案夾作為Gradle預設的本地倉庫去存儲Jar包。

03

Gradle項目建立注意事項

接下來我們用idea建立一個最簡單的Gradle管理項目看一下其項目結構。

進入Idea初始界面,先看看是否可以配置Gradle的預設使用。

gradle 項目打包成多個jar包_快速上手Gradle
gradle 項目打包成多個jar包_快速上手Gradle

發現隻能配置Gradle的倉庫位置,并不能确定版本,那就先不設定了。

還是回到首頁先建立Gradle項目

gradle 項目打包成多個jar包_快速上手Gradle
gradle 項目打包成多個jar包_快速上手Gradle

finish建立Gradle項目。

gradle 項目打包成多個jar包_快速上手Gradle

進去之後是這個樣子。

我們要設定一下使用Gradle的版本。

gradle 項目打包成多個jar包_快速上手Gradle

預設使用.gradle作為預設倉庫,同時使用版本讀取gradle-wrapper.properties,下面是檔案内容

gradle 項目打包成多個jar包_快速上手Gradle

檔案的意思是會先去讀取系統變量中的%Gradle_User_Home%作為釋出包/打壓縮包位址,/wrapper/dists作為Gradle的下載下傳目錄,同時預設使用的是gradle6.1版本。

我們作個性化設定。

gradle 項目打包成多個jar包_快速上手Gradle

使用Maven的倉庫并且使用Gradle4.7。

但是這裡要注意一個問題,此處設定了預設倉庫隻是針對Idea的,如果我們想在自己在cmd中編譯打包等操作也用我們指定的倉庫時,需要在系統變量中添加如下配置。

gradle 項目打包成多個jar包_快速上手Gradle

OK,這些基本配置好後就可以開始玩Gradle了。

04

Gradle項目目錄結構

gradle 項目打包成多個jar包_快速上手Gradle

可以看到項目裡是沒有Pom檔案的,相對的會有一個build.gradle以及settings.gradle。另外還會有一個專門的gradle檔案包,目前裡面隻裝了wrapper(包裝者?)裡面的配置我們上面有貼出來。項目主體src下的内容和Maven建立時沒有什麼不同。

gradle 項目打包成多個jar包_快速上手Gradle

05

Groovy簡單文法

這裡先不說這些配置檔案裡面的内容,因為這裡面的内容都是用Groovy語言編寫的,先大概了解了語言我們才能明白配置檔案裡寫了什麼。

gradle 項目打包成多個jar包_快速上手Gradle

看到其結合語言就知道,Groovy是追求容錯低的弱語言。

Groovy 是 用于Java虛拟機的一種靈活的動态語言,它是一種成熟的面向對象程式設計語言,既可以用于面向對象程式設計,又可以用作純粹的腳本語言。使用該種語言不必編寫過多的代碼,同時又具有閉包和動态語言中的其他特性。

Groovy是JVM的一個替代語言(替代是指可以用 Groovy 在Java平台上進行 Java 程式設計),使用方式基本與使用 Java代碼的方式相同,該語言特别适合與Spring的動态語言支援一起使用,設計時充分考慮了Java內建,這使 Groovy 與 Java 代碼的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的結合程式設計。

大概先看這些了解一下,我們這裡追求快速了解哈。

gradle 項目打包成多個jar包_快速上手Gradle

先使用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檔案如下

gradle 項目打包成多個jar包_快速上手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/

gradle 項目打包成多個jar包_快速上手Gradle

搜尋spring,選取spring framework

gradle 項目打包成多個jar包_快速上手Gradle

選取版本

gradle 項目打包成多個jar包_快速上手Gradle

選取gradle

gradle 項目打包成多個jar包_快速上手Gradle

下面的内容就是gradle的坐标格式了,複制粘貼到build.gradle中就好。

gradle 項目打包成多個jar包_快速上手Gradle

OK,這樣一個依賴就加好了。

07

Gradle使用Maven倉庫

從groovy文法可以知道,其實配置檔案中的内容都是方法,比如mavenCentral(),我們按住ctrl點選進去,可以看到類和方法,和java一樣。

gradle 項目打包成多個jar包_快速上手Gradle

我們看到其中有一個方法是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包

gradle 項目打包成多個jar包_快速上手Gradle

輸出

上午 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包位置

gradle 項目打包成多個jar包_快速上手Gradle

09

Gradle建構War工程

web工程建立和jar是一樣的,隻是需要自己在src下建立webapp以及在build.gradle中添加war包類型即可。

gradle 項目打包成多個jar包_快速上手Gradle
gradle 項目打包成多個jar包_快速上手Gradle

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啟動後的輸出

gradle 項目打包成多個jar包_快速上手Gradle

打war包

gradle 項目打包成多個jar包_快速上手Gradle
gradle 項目打包成多個jar包_快速上手Gradle

10

Gradle建構聚合工程

聚合工程是最重要的,因為一般項目裡都會是這個模式,類似于Maven的聚合,也是由Parent管理子子產品的共性Jar包。具體如何建立我們來看下。

首先建立父工程和一般的項目一樣。

gradle 項目打包成多個jar包_快速上手Gradle

然後對着項目右鍵newModule,操作差不多,改個名字就好。

gradle 項目打包成多個jar包_快速上手Gradle

出現子項目,且在父工程的settings.gradle檔案中包含子子產品資訊。

如法再建一個web

gradle 項目打包成多個jar包_快速上手Gradle

我們将web還是變成war工程

gradle 項目打包成多個jar包_快速上手Gradle

再建立一個service

gradle 項目打包成多個jar包_快速上手Gradle

把之前的web工程的配置都拷貝過來。

gradle 項目打包成多個jar包_快速上手Gradle

然後開始導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

gradle 項目打包成多個jar包_快速上手Gradle

這些父工程都有,可以先清掉,以後有個性化配置可以給每個子工程自己的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

gradle 項目打包成多個jar包_快速上手Gradle

web改一下springmvc.xml

gradle 項目打包成多個jar包_快速上手Gradle

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

gradle 項目打包成多個jar包_快速上手Gradle

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

gradle 項目打包成多個jar包_快速上手Gradle

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跑起來後頁面如圖

gradle 項目打包成多個jar包_快速上手Gradle

如果想打包,對着parent去build就可以啦

gradle 項目打包成多個jar包_快速上手Gradle
gradle 項目打包成多個jar包_快速上手Gradle
gradle 項目打包成多個jar包_快速上手Gradle

OK,今天就分享到這裡啦~

項目源碼:

https://github.com/pengwenqq/studyDemo