プロジェクト

全般

プロフィール

Gradle

高橋 徹 さんが約1年前に追加

Gradleを使ってのメモ(Wikiに記載する前のネタなど)


返答 (4)

gradle initをせずにプロジェクトを作る - 高橋 徹 さんが約1年前に追加

gradle initをせずにプロジェクトを作ることも可能です。

前提
  • ローカルマシンに、GradleとJDKが入っている(wrapperタスク実行時のみローカルマシンにGradleが必要)
  • インターネットに接続している

まず、プロジェクトのためのディレクトリを作成します。

work% mkdir hello
work% cd hello
hello%
  • build.gradle.kts

空のbuild.gradle.ktsを作成します。デフォルトのタスクでwrapperが用意されているのでこれを実行します。
gradle wrapperタスクを実行すると、gradleのダウンロードとwrapperスクリプトを生成します。

hello% gradle wrapper
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

hello% ls -a         
.            build.gradle.kts    gradlew.bat
..            gradle
.gradle            gradlew

.gradleディレクトリはリポジトリで共有しないので、gitignoreなどに指定しておきます。

build.gradle.kts に必要な定義をしていきます。

  • build.gradle.kts
plugins {
    application
}

application {
    mainClass.set("com.torutk.hello.HelloApp")
}

Gradleに applicationプラグインの使用を指定します。applicationプラグインを指定すると、暗黙的に java プラグインと distribution プラグインもプロジェクトに適用されます。

メインクラスを定義します。ソースファイルは、src/main/javaディレクトリの下にパッケージに応じたパスに配置するとの暗黙的な定義が java プラグインにあるので、それに応じて配置します。

hello/
  +- src
    +- main
      +- java
        +- com
          +- torutk
            +- hello
              +- HelloApp.java
package com.torutk.hello;

public class HelloApp {
    public static void main(String[] args) {
        System.out.println("Hello, hand made gradle project.");
    }
}

runタスクを実行します。

hello % gradle run                     

> Task :run
Hello, hand made gradle project.

BUILD SUCCESSFUL in 416ms
2 actionable tasks: 2 executed

runタスクは、Javaソースファイルをコンパイルしてメインクラスを実行します。jarファイルは生成しません。

jarタスクを実行します。

hello% ./gradlew jar

BUILD SUCCESSFUL in 480ms
2 actionable tasks: 1 executed, 1 up-to-date

hello % ls build/libs     
hello.jar

プロジェクト名(Gradleビルド定義のあるディレクトリ名)がjarファイル名として適用されています。

jlinkプラグイン - 高橋 徹 さんが12ヶ月前に追加

https://github.com/beryx/badass-jlink-plugin

OpenJDKのjlinkコマンドを使って、カスタムJREとアプリケーションのイメージを作成、jpackageコマンドを使ってのOS固有インストーラの作成を簡単に実現するプラグイン。

build.gradle.kts への記述

  • pluginsに、jlinkプラグインのIDとバージョンを指定
plugins {
    application
    id("org.beryx.jlink") version "3.0.1" 
}

この記述だけで、デフォルトの設定でカスタムJREが生成されます。
jlinkタスクを実行すると、以下のようにbuildディレクトリ下にカスタムJREのディレクトリ(image)が作られ、アプリケーションの実行に必要なJREとアプリケーションが生成されます。

hello
  +-- build
        +-- image                      [1]
              +-- bin
              |     +-- hello          [2]
              |     +-- hello.bat      [2]
              +-- conf
              +-- include
              +-- legal
              +-- lib
              +-- man
              +-- release
  • カスタムJREのディレクトリ名はデフォルトで image
  • カスタムJREのアプリケーション起動バッチ・スクリプトファイル名は、プロジェクト名(プロジェクトのディレクトリ)

jlinkZipタスクを実行すると、imageディレクトリをアーカイブしたzipファイル(image.zip)が生成されます。

jlinkのコマンドオプションを build.gradle.kts に記述

カスタムJREのディレクトリ名、ZIPファイル名は次のように指定できます。

version = "1.0.1" 

jlink {
    imageName = "hello-$version" 
}

jlinkのオプションの指定は次です。

jlink {
    imageName = "hello-$version" 
    options = listOf("--strip-debug", "--no-header-files", "--no-man-pages")
    launcher {
        name = "sayhello" 
    }
}

バージョン番号を自動で付ける - 高橋 徹 さんが11ヶ月前に追加

ビルド成果物には、versionに基づくファイル名が付与されます。
そこで、アプリケーションのアップデートをするたびに、build.gradleのバージョンテキストを変更しコミット、さらにリポジトリにタグを打つといった作業が発生して少々面倒です。

Gradleのプラグインに、gitリポジトリのバージョン情報を引いてきてバージョンに適用してくれるものがいくつかありました。

palantirは、ローカルのgitリポジトリの状態だけを見て、version名を決定します。
HEADにタグが付いていない場合、最後のタグからのコミット回数とハッシュをversion名に含めます。また、コミット忘れたファイルが存在するとdirtyを付けるなど凝った振る舞いもあります。

axionは、ローカルのgitリポジトリのタグを見て version名を決定します。が、リモートの状態も見に行っている模様。
タグがない場合、v0.1.0 が付いているとみなします。HEADにタグが付いていないと、バージョン名に-SNAPSHOTを付けます。
releaseタスクを実行すると、現在のバージョンを1つインクリメントしたタグをgitに付けます。バージョン番号の前に、vとかrelとか接頭辞が付いていると、それに倣ってタグ名を付けてくれます。
次のバージョンをインクリメントではなく指定したい場合、markNextVersionタスクでバージョンを指定するようです。
このプラグインは、依存ライブラリをたくさんダウンロードしています。

机上調査メモ

palantir gradle git version

build.gradle.ktsの記述

plugins {
    id("com.palantir.git-version") version "<current version>" 
}

val gitVersion: groovy.lang.Closure<String> by extra
version = gitVersion()

gradleを実行する環境は、git管理下である必要があります。
gradle printVersionタスクを実行すると、そのgit管理に基づくバージョン番号を表示します。

% ./gradlew printVersion

> Task :app:printVersion
3a53e9b.dirty

上述の状況で生成される成果物に付与されるバージョンは次のようになります。

  • gitにタグがない場合、プラグイン名とコミットハッシュが付与
    例)app-3a53e9b.dirty.zip
  • gitにタグを付けると、(例:git tag v0.1.0
    例)app-v0.1.0.zip
% ./gradlew printVersion

> Task :app:printVersion
v0.1.0
  • git管理下のファイルに変更を加えて、未コミット状態でビルドすると、バージョン名に.dirtyが付きます。
% ./gradlew printVersion                          

> Task :app:printVersion
v0.1.0.dirty
  • git管理下に変更をコミットして、タグは付与していないと、最後に付与したタグからの変更がバージョン名に付きます。タグをつけてからのコミット数と現在のコミットハッシュが付きます。
    % ./gradlew printVersion          
    
    > Task :app:printVersion
    v0.1.0-1-g13a45d3
    
axion-release-plugin

build.gradle.ktsの記述

plugins {
    application
    id("pl.allegro.tech.build.axion-release") version "1.16.1" 
}

version = scmVersion.version

このプラグインを入れると、currentVersionタスクとreleaseタスクが定義されます。

  • gitのタグを打っていないローカルリポジトリ

currentVersionタスクを実行

% ./gradlew currentVersion
:
Project version: 0.1.0-SNAPSHOT

releaseタスクを実行

./gradlew release       

> Task :app:verifyRelease
Looking for uncommitted changes.. 
Skipping ahead of remote check
Checking for snapshot versions.. 

> Task :app:release
Creating tag: v0.1.0
Changes made to local repository only

releaseタスク実行すると、gitのローカルリポジトリにタグが打たれます。

% git tag
v0.1.0

currentVersionタスクを実行すると、gitのタグに基づく 0.1.0が得られます。

% ./gradlew currentVersion  
  :
Project version: 0.1.0

生成される成果物も、app-0.1.0.zip のようにversionが適用されます。

  • gitでローカルの修正(コミットなし)

currentVersionタスクの結果は、変化なし

  • gitでタグの後にコミット

currentVersionタスクの結果は、0.1.1-SNAPSHOT となります。

warプロジェクトを作る - 高橋 徹 さんが9ヶ月前に追加

サーブレットプログラムを作るには、Gradleのwarプラグインを使います。
しかし、gradle initで生成する選択肢に war プロジェクトは存在しません。
次のissueでwebappをinitで生成できるようにするリクエストが上がっていますが、対応は進んでいないようです。
https://github.com/gradle/gradle/issues/2339

IntelliJ IDEA 2023では新規プロジェクト作成の機能で、Jakarta EE Webアプリケーションの生成が可能ですが、GradleのDSLはGroovyのみとなっています。

  • IntelliJ IDEAでJakarta EE Web ApplicationプロジェクトをGradle用に作成し、build.gradleをbuild.gradle.ktsに書き換える
  • gradle init で、Java Application を種類として指定して生成、その後build.gradle.ktsの書き換え、ソースディレクトリの追加などを行う
  • からのGradleプロジェクトを生成し追記していく
    (1-4/4)