Gradle とは?

インストール

プロジェクトの作成

$ gradle init --type java-library

まぁ、コマンドラインじゃなくても IDE (Eclipse/Netbeans/IntelliJ) に任せればよかろう

ディレクトリ構成

$ tree
.
└── JettyExam
    ├── LICENSE
    ├── README.md
    ├── bin
    │     ├── main/ ← コンパイル結果
    │     └── test/ ← コンパイル結果
    ├── build / ← ビルド結果 (プロジェクト全体を zip 圧縮したものや、製品の jar など)
    ├── build.gradle ← ★これが gradle スクリプト
    ├── gradle
    │     └── wrapper
    │             ├── gradle-wrapper.jar
    │             └── gradle-wrapper.properties
    ├── gradle.properties
    ├── gradlew      ← ★これが、このプロジェクト向けの設定が入った gralde 実行スクリプト。プロジェクト作成時に自動生成される
    ├── gradlew.bat  ← ★その Windows用
    ├── settings.gradle
    └── src
        ├── main
        │     ├── java/ ← ソースコード
        │     └── resources/ ← 設定ファイル類
        └── test
             ├── java/ ← テストコード 
             └── resources / ← テストデータ類

ビルドコマンド

ひな型

https://github.com/kagyuu/JettyExam/blob/master/build.gradle

buildscript {
    ext.buildConfig = [
        'compileSdk': 11,
        'targetSdk': 11,
        'main': 'com.example.jetty.Main'
    ]
    ext.versions = [
        'jetty': '9.4.25.v20191220',
        'jersey': '2.30',
        'derby': '10.15.1.3',
        'derby8': '10.14.2.0'
    ]
}

plugins {
    // check library versions
    // $ ./gradlew dependencyUpdates
    id "com.github.ben-manes.versions" version "0.27.0"
    id "com.github.johnrengelman.shadow" version "4.0.4"
    id 'java'
}

jar {
    manifest {
        attributes "Main-Class" : "${buildConfig.main}"
    }
}

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

apply plugin: 'java'
apply plugin: 'jacoco'

// To avoid "java.lang.NoSuchFieldException: $jacocoAccess"
jacoco {
    toolVersion = "0.8.4"
}

apply plugin: 'application'
//apply plugin: 'war' //

sourceCompatibility = "${buildConfig.compileSdk}" // -source
targetCompatibility = "${buildConfig.targetSdk}" // -target

mainClassName = "${buildConfig.main}"

compileJava {
    options.encoding = 'UTF-8'
    options.compilerArgs << '-Xlint:unchecked'
}

test {
    testLogging {
        events 'standard_out', 'standard_error'
    }
}

repositories {
    google()
    mavenCentral()
    jcenter()
}

dependencies {
    // https://mvnrepository.com/artifact/commons-cli/commons-cli
    compile 'commons-cli:commons-cli:1.4'
    
    // The Jetty Web Server.
    compile "org.eclipse.jetty:jetty-servlet:${versions.jetty}"
    compile "org.eclipse.jetty:jetty-webapp:${versions.jetty}"
    
    // JAX-RS (REST API), CDI
    compile "org.glassfish.jersey.core:jersey-server:${versions.jersey}"
    compile "org.glassfish.jersey.containers:jersey-container-servlet-core:${versions.jersey}"
    compile ("org.glassfish.jersey.containers:jersey-container-jetty-http:${versions.jersey}") {
        exclude group : 'org.eclipse.jetty', module : 'jetty-util'
    }
    compile "org.glassfish.jersey.media:jersey-media-json-jackson:${versions.jersey}"
    compile "org.glassfish.jersey.inject:jersey-hk2:${versions.jersey}"
    
    // logs
    compile 'ch.qos.logback:logback-classic:1.2.3'
    
    // JPA (Database)
    compile 'org.eclipse.persistence:eclipselink:2.7.6'

    if (buildConfig.targetSdk < 9) {
        println "Target SDK is ${buildConfig.targetSdk} => Use Derby ${versions.derby8}"
        compile "org.apache.derby:derby:${versions.derby8}"
        compile "org.apache.derby:derbytools:${versions.derby8}"
    } else {
        println "Target SDK is ${buildConfig.targetSdk} => User Derby ${versions.derby}"
        compile "org.apache.derby:derby:${versions.derby}"
        compile "org.apache.derby:derbytools:${versions.derby}"
        compile "org.apache.derby:derbyshared:${versions.derby}"
    }    
        
    // Lombok (Getter/Setter)
    compileOnly 'org.projectlombok:lombok:1.18.10'
    annotationProcessor 'org.projectlombok:lombok:1.18.10'
    
    // Lookup classes by it's annotation
    compile 'io.github.classgraph:classgraph:4.8.61'
    
    // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
    
    // JEP 320: Remove the Java EE and CORBA Modules (from JavaSE11)
    // http://openjdk.java.net/jeps/320
    // -> Use RI libraries from Maven Central
    // java.xml.ws RI
    compile 'com.sun.xml.ws:jaxws-ri:2.3.2' 
    // java.xml.bind RI
    compile 'javax.xml.bind:jaxb-api:2.3.1'
    compile 'com.sun.xml.bind:jaxb-core:2.3.0.1'
    compile 'com.sun.xml.bind:jaxb-impl:2.3.0.1'
    // java.activation RI
    compile 'com.sun.activation:javax.activation:1.2.0'
    // java.xml.ws.annotation RI
    compile 'javax.annotation:javax.annotation-api:1.3.2'
    // java.transaction RI
    compile 'javax.transaction:javax.transaction-api:1.3'
    // to fix Javadoc error : "class file for javax.interceptor.InterceptorBinding not found"
    // related to JPA transction-api
    compileOnly 'javax.interceptor:javax.interceptor-api:1.+'
    
    // Test
    testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
    testCompile group: 'junit', name: 'junit', version: '4.13'
    testCompile 'org.jmockit:jmockit:1.12'
}

Tips

定数定義

buildscript {
  ext.buildConfig = [
      'compileSdk': 11,
      'targetSdk': 11
  ]
  ext.versions = [
      'jetty': '9.4.25.v20191220',
      'jersey': '2.30',
      'derby': '10.15.1.3'
  ]
}

とすると、${buildConfig.compileSdk} や ${versions.jettty} で、値を参照できる

ライブラリのバージョン確認

plugins {
    // check library versions
    // $ ./gradlew dependencyUpdates
  id "com.github.ben-manes.versions" version "0.27.0"
}

というように build.gradle を書いておき、コマンドラインから

$ ./gradlew dependencyUpdates

を実行すると最新のライブラリが使われているか調べることができる

全部盛りJar (Fat Jar) を作る

plugins {
 id "com.github.johnrengelman.shadow" version "4.0.4"
}

で全部盛りJarが作られる

java -jar で実行されるクラスの指定

jar {
    manifest {
        attributes "Main-Class" : "com.example.jetty.Main"
    }
}

で Jar の MANIFEST に属性を書き込むことができる

gradlew run で実行されるクラスの指定

mainClassName = 'com.example.jetty.Main'

javac のオプションの指定

sourceCompatibility = "${buildConfig.compileSdk}" // -source
targetCompatibility = "${buildConfig.targetSdk}" // -target'

mainClassName = "${buildConfig.main}"
 
compileJava {
    options.encoding = 'UTF-8'
    options.compilerArgs << '-Xlint:unchecked'
}

依存ライブラリの指定

dependencies {
    // https://mvnrepository.com/artifact/commons-cli/commons-cli
    compile 'commons-cli:commons-cli:1.4'
    ...
}

依存ライブラリが、依存しているライブラリを除く

compile ("org.glassfish.jersey.containers:jersey-container-jetty-http:${versions.jersey}") {
    exclude group : 'org.eclipse.jetty', module : 'jetty-util'
}

テストクラスの標準出力を表示する

test {
    testLogging {
        events 'standard_out', 'standard_error'
    }
}

ライブラリの参照先を google, maven-central, jcenter にする

repositories {
    google()
    mavenCentral()
    jcenter()
}

ビルドの途中で標準出力にログを出力する

   println "Target SDK is ${buildConfig.targetSdk} => Use Derby ${versions.derby8}"

ビルドの中で条件分岐する

   if (buildConfig.targetSdk < 9) {
       println "Target SDK is ${buildConfig.targetSdk} => Use Derby ${versions.derby8}"
       compile "org.apache.derby:derby:${versions.derby8}"
       compile "org.apache.derby:derbytools:${versions.derby8}"
   } else {
       println "Target SDK is ${buildConfig.targetSdk} => User Derby ${versions.derby}"
       compile "org.apache.derby:derby:${versions.derby}"
       compile "org.apache.derby:derbytools:${versions.derby}"
       compile "org.apache.derby:derbyshared:${versions.derby}"
   }

上記のように条件分岐がいるのは、Apache Derby が、Java 8 用と Java 9 or higher 用で異なるため。ライブラリパッケージの構成も異なる。


Java#Jetty


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2020-02-27 (木) 02:42:24 (1712d)
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=b2933373c5
ISBN10
ISBN13
9784061426061