跳到主要內容

Gradle(13)–– Plugin Management

前面有介紹如何建立web專案或是Java專案等等,本章詳細說明Gralde

  • 多Gradle腳本運用

當你需要載入其他gradle腳本時,使用apply from 還載入

語法: apply from: <Path of otherfile.gradle>

範例一、 多Gradle腳本載入

C\:>calcuate.gradle   //計算

apply plugin: 'java'
task task1 {
    println "task1"
}


C\:>project.gradle

apply from:  "calcuate.gradle"

task  mainTask {
    println "It is a main task!"
}

結果

task1
It is a main task!



二位元插件
二進位插件必須實做Plugin的介面功能後,你可以載入它到你的建構腳本。Gradle已經內件函式庫
可以使用。如果你想要使用其他third-party pluings,需要確定可用的classpath路徑,請使用buildscript{}
來設定。

語法 : apply plugin: '<pluginid>'
範例一、 apply plugin : “java”

  • Gradles內建plugins

(1) 建構和測試常用plugins
     Java , Groovy , Scala,  War
(2) 分析plugins
    Checkstyle ,FindBugs ,Sonar ,Sonar Runner ,PMD
(3) IDE plugins
     Eclipse, IDEA ..etc

參考: https://docs.gradle.org/current/userguide/userguide.

  • Third plugins

https://plugins.gradle.org/

  • Java plugin

Java plugin是Gradle的核心一部份,它可以保證我們建構Java專案可以正確編譯、測試和打包。
載入方式為apply plugin: 'java'。

接下來討論建構的任務,我們可以在命令列執行下列的指令:
$ gradle tasks --all

可以看出顯示任務不同有建構任務、測式任務、文件任務等等,使用Java plugin需要符合內建的規範
例如: compileJava和processResources會執行src/main/java 的src/main/resources內的檔案,所以將
完成的java檔和環境設定檔需要分別放在src/main/java 的src/main/resources裡面。接下來我們會說明
gradle的Java plugin指令的功用

範例一、當編譯在src/main底下的java檔案,我們可以使用任務 classes,編譯後的.classes會放在
/build/classes底下,可以下面看到gradle所執行任務的流程。

$ gradle classes

:compileJava
:processResources UP-TO-DATE
:classes

範例二、testClasses用來編譯測試檔與測試環境,編譯後的.classes會放在/build/classes/test底下,
可以下面看到gradle所執行任務的流程。

$ gradle testClasses

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE

範例三、任務test除了編譯檔案外,他會幫我們產生測試報表,放在/build/reports裡面

$ gradle test

C:\Users\bryan\workspace\ex1>gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE                                                  //執行junit並產生報表

範例四、使用assemble任務或是jar任務會打包.class和resource的資料到jar檔中並放在build/libs
檔案命名為<project-name>.jar ,如果有加入版本會以<name>-<version>.jar.

$ gradle assemble

Total time: 11.204 secs
C:\Users\bryan\workspace\ex1>gradle assemble
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar
:assemble

範例五、 Gradle也有提供一連串完成的任務叫做build,它會從編譯、打包、測試到完整執行,就不需要
分別的執行,其中clean任務會先清除在build/裡面的資料,再進行build任務

$ gradle clean
$ gradle build

C:\Users\bryan\workspace\ex1>gradle clean
:clean

Total time: 5.866 secs
C:\Users\bryan\workspace\ex1>gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE

BUILD SUCCESSFUL

範例六、可以在build.gradle列印出這些變數,顯示出目前目前專案libs路徑、程式的路徑等等。詳細可以查https://docs.gradle.org/current/userguide/java_plugin.html.

task displayJavaPluginConvention << {
    println "Lib Directory: $libsDir"
    println "Lib Directory Name: $libsDirName"
    println "Reports Directory: $reportsDir"
    println "Test Result Directory: $testResultsDir"
    println "Source Code in two sourcesets: $sourceSets"
    println "Production Code: ${sourceSets.main.java.srcDirs}"
    println "Test Code: ${sourceSets.test.java.srcDirs}"
    println "Production code output: ${sourceSets.main.output.classesDir}  ${sourceSets.main.output.resourcesDir}"
    println "Test code output: ${sourceSets.test.output.classesDir}  ${sourceSets.test.output.resourcesDir}"

}

  • 專案環境設定

在上面我們學到如何是用預設環境(default properties or conventions)去建立java專案且可以成功編譯,在本節
會學習到如何根據我們的需求客置設定環境

範例一、我們有一個專案需要將編譯的路徑做一些調整如下:
系統預設: src/main/java  => src/sale
系統預設:  src/test/java   => src/saleTest
系統預設:

buildDir = 'buildfolder'
libsDirName = 'libfolder'
sourceSets {
main {
     java {
         srcDir 'src/sale/java'
      }
      resources {
      srcDir 'src/saleTest/resources'
     }
  }
test{
    java {
        srcDir 'src/testcode/java'
         }
        resources {
        srcDir 'src/testcode/resources'
     }
  }
}

testResultsDirName = "$buildDir/new-test-result"
sourceSets.main.output.classesDir="${buildDir}/classes/sale/java"
sourceSets.main.output.resourcesDir="${buildDir}/classes/sale/resources"
sourceSets.test.output.classesDir="${buildDir}/classes/saleTest/java"
sourceSets.test.output.resourcesDir="${buildDir}/classes/saleTest/resources"

留言

這個網誌中的熱門文章

JavaBean 和POJO

前言 今天介紹JavaBean和POJO的不同,這兩個名詞在JAVA文章常常被拿來使用以及討論。在JDK1.1時候釋出才有的一個標準架構,很多時候常常被搞混,所以我們特別開闢一章來加以討論。POJO規範在企業級應用已經廣大的被使用的規範。 解釋 POJO : 全名為Plain-old-Java-object,只需要繼承Object就可以,沒有特定規定,只要建立的類別有setter/getter方法都可以稱為POJO JavaBean: JavaBean通常用來封裝多個物件成為單獨物件使用,規範比較嚴格,規則如下 規則 說明 1 需要實作序列(Serializable/Externalizable) 2 不能有參數的建構子( no-arg constructor) 3 需要有公用setter/getter 4 屬性必須要私人(private) 5 屬於特定POJO規則 比較 所有的JavaBean都為POJO,但是所有的POJO不一定為JavaBean 都可以當作重複元件 都必須序列化 特性都為可用性、易用性和持久化使用 - 應用 由圖我們可以知道POJO在應用程式中,主要用來存取資料庫資料達到持久化的目的,並提供給商業邏輯流程處理使用。這種POJO的架構提供程式人員開發時的可以很有規則將資料封裝並加以使用。 範例1. JavaBean(以員工為實例) JavaBean建立員工物件,可以發現Employee物件建構子沒有任何參數,屬性為私有化並setter/getter的命名方式。 //實作序列化 public class Employee implements java.io.Serializable{ private int id; private String name; //無參數建構子 public Employee(){} //以下實作setter/getter public void setId(int id){this.id=id;} public int getId(){return id;} public void setName(String ...

Python AI-手寫辨識

Python AI-手寫辨識 類神經網路-手寫辨識 手寫辨識 (1) 問題定義 將輸入手寫數字圖片,經由類神經網路訓練後,可以辨識手寫圖片得到一個正確的答案,例如讓電腦辨識上面圖片手寫數字0-9,都可以認得.在了解問題後,需要先知道輸入的資料格式,例如圖片為NxN的矩陣向量. 輸入:輸入的資料格式有很多種,例如數字圖片為矩陣向量 模型:NN 輸出:輸出的方式,神經網路輸出不一定跟輸入同值,手寫數字輸入為1,輸出有可能是1.1或是1.5等等,所以輸出必須經過轉換成真實世界的數字. (2)定義函式 輸出會有兩個問題: A.輸出利用one-hot encoding來表示,就是N個狀態會對應N的結果,例如:輸出結果為1,表示[0,1,0,0,0,0,0,0,0,0] B.輸出結果不能超過1,我們通常會利用 Softmax函数 來進行輸出的處理. (3) 準備訓練/測試資料 在這邊需要從輸入去定義那些要當作訓練與測試資料,我們手寫資料使用MNIST 資料庫來訓練使用,MNIST共有70,000筆手寫資料,60,000筆為訓練資料,10,000為測試資料. (4)建構類神經網路模型 開始建構我們的神經網路模型,首先決定好28x28的像素(這邊不用擔心如何將圖片轉成矩陣),模型使用SGD的方式進行學習,輸出是一個10為的陣列來表示. 輸入:手寫數字圖片(28x28=784) 模型:SGD 輸出:數字(one hard encoding) (5)學習 首先介紹SGD(Stochastic Gradient Descent) 的學習方式,因為蕾神經網路需要訓練很多次才會提高準確度,SGD最大的好處就是當每次重新學習的會將訓練資料打散,來防止機器學習將答案死背下來. (6)實作開發 下面程式碼有完整的說明,這邊就不多說明了,當開始執行程式時就會進行資料訓練. 由訓練結果最後acc=0.9447,表示準確率可以到達94%,我們再由實際測試可以看出該圖為7的圖示,由神經網路判斷為7,跟我們人類判斷相同,我們可以知道由訓練的結果可看得到不錯的準確度. 執行神經網路遇到不少問題,請參考下面連結,是筆者所整理的問題集,請多多指教 https://programdoubledragon.bl...

Python AI-問題集

Python AI-問題集 問題集 Jupyter Notebook執行ipywidgets會出現kernel死掉的錯誤發生(The kernel appears to have died) 解決方法 (1) 根據log檔來判斷問題: 例如:log訊息出現OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized. (2) 根據問題關鍵字找出問題所在: 利用google查詢所遭遇到的問題,例如我把上面的問題上google查詢可以找到這篇的解法 https://blog.csdn.net/bingjianIT/article/details/86182096 (3)實作解法: 我實作下面解法後,就可以順利執行手寫辨識的程式. //在Python宣告時加入 import os os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" 參考 https://blog.csdn.net/bingjianIT/article/details/86182096