gradle系列--task

其他網址

Gradle 教程_w3cschool(不帶子目錄)

Gradle User Guide 中文版(帶子目錄)   (英文版:Gradle User Manual

Gradle DSL Version 6.5(Gradle英文文檔)

簡介

任務是最小的工作單元,每個任務由動作和任務依賴組成,對應類 org.gradle.api.Task

jar

其他網址

Gradle打可運行Jar包(包含依賴第三方庫中的類) - buddie的個人空間 - OSCHINA

簡介

jar是任務,用於組裝 JAR 文件。

實例1:最簡單的grable打包

打出來的Jar包中,只包含了自己編寫的代碼編譯成的Class文件。其它依賴的Jar包中的類,不在其中。

1.Idea創建普通gradle工程:Idea項目系列--創建gradle工程_feiying0canglang的博客-CSDN博客

2.在src/main/java下新建org.example.a.Demo.java,內容爲:

package org.example.a;

public class Demo {
    public static void main(String[] args) {
        System.out.println("This is main");
    }
}

4.修改build.gradle

plugins {
    id 'java'
}

group 'com.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

jar {
    manifest {
        attributes "Main-Class": "org.example.a.Demo"
    }
}

4.執行打包操作
法1:直接點gradle的build按鈕

法2:執行gradle jar命令

上邊第3步執行完之後,會在項目路徑的build\libs生成test_gradle-1.0-SNAPSHOT.jar

解壓test_gradle-1.0-SNAPSHOT.jar:

若build.gradle這樣寫:

plugins {
    id 'java'
}

group 'com.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

jar {
    manifest {
        attributes "Main-Class": "org.example.a.Demo"
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
    }
}

生成的MANIFEST.MF結果:

 因爲java插件已有jar任務,上邊兩種寫法其實只是修改了jar任務,若這樣寫build.gradle

plugins {
    id 'java'
}

group 'com.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

 生成的MANIFEST.MF結果:

4.測試結果

執行java -jar test_gradle-1.0-SNAPSHOT.jar,運行結果:

This is main

實例2:將第三方類打包進去

將第三方類也打包進去的方法

  1. 引用application插件,通過distTar或distZip打包。這樣生成的包裏不僅包含了自己項目中寫的源碼編輯成的jar包,還包括gradle中配置依賴的jar包,同時還生成了shell和bat腳本,通過腳本,可以直接運行我們的程序。
  2. 打jar包,直接依賴的第三方類庫中的類,一起打包到我們的jar中。(本例採用此法)

build.gradle

jar {
    manifestContentCharset 'utf-8'
    metadataCharset 'utf-8'
    manifest {
        attributes "Main-Class": "cn.buddie.GradleTest"
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

也可以直接用java -jar xxx.jar運行

實例3:單jar包與tar包都生成

        如果領導說,你即需要提供單個的jar,又需要提供tar包,怎麼辦呢?因爲修改了task jar,而task distTar是依賴於task jar。這樣的後果就是打出來的tar包中,已經包含了所有你依賴的第三方jar包。同時,你自己項目打出的jar包中,又包含了這些第三方jar包中的類。也就是所有第三方的類,都重複了!

解決方案爲:增加參數,讓task jar根據參數來決定是否將第三方依賴類打入自己的jar包。

jar {
    manifestContentCharset 'utf-8'
    metadataCharset 'utf-8'
    manifest {
        attributes "Main-Class": "cn.buddie.GradleTest"
    }
    if (project.hasProperty("allInOne")) {
        from {
            configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
        }
    }
}

        增加了一個“allInOne”的參數,如果不指定參數,就不會將第三方依賴類打入jar包。這樣在執行task distTar時,不指定參數,打出來的tar中,第三方依賴類就只有一份。而在需要所有類在一個Jar包中的Jar文件時,可以使用參數打包

gradle jar -PallInOne
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章