天天看點

使用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的來源有兩種:

  1. 插件提供,gradle有很多現成的插件;
使用gradle建構java項目(1)
  1. 自定義:在build.gradle 檔案中聲明task
使用gradle建構java項目(1)

生命周期

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:

  1. Create a Settings instance for the build.
  2. Evaluate the settings.gradle script, if present, against the Settings object to configure it.
  3. Use the configured Settings object to create the hierarchy of Project instances.
  4. 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 <任務名>

使用gradle建構java項目(1)

方式二:使用項目中的腳本

./gradlew <任務名>

使用gradle建構java項目(1)

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

使用gradle建構java項目(1)

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 方法的參數是一個配置閉包,那麼這個閉包有哪些配置呢?

使用gradle建構java項目(1)

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中依賴的倉庫有多種:

使用gradle建構java項目(1)
https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html

我們可以選擇 maven倉庫:

repositories {
    mavenCentral()
}           

也可以使用本地的 maven 倉庫:

repositories {
    mavenLocal()
}           
使用gradle建構java項目(1)

甚至可以直接指定依賴的 jar 包目錄:

maven {
        url "lib"
    }           

那麼 查詢依賴就和maven一樣了 .

gradle的插件有哪些

參考

https://docs.gradle.org/current/userguide/userguide.html
使用gradle建構java項目(1)

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建構java項目(1)
使用gradle建構java項目(1)

gradle 與maven相比有哪些優勢

  1. 功能更強大,可以很友善的自定義任務;
  2. 添加依賴更簡潔友善;
  3. 任務的執行流程更靈活,不像maven的生命周期那麼固定.
  4. 可以編寫 groovy 代碼,我們知道 groovy 是非常靈活的。

https://my.oschina.net/huangweiindex/blog/1844872 https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.DependencyHandler.html

我項目中完整的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'
}