電気ひつじ牧場

技術メモと日常のあれこれ

プロジェクト途中からのgradle

今まで普通にjavacとjavaコマンドでJavaを使ってましたが、クラスパスの指定やソースファイル指定がいい加減辛い(ビルド用の.shがかっこ悪い)のでgradleを導入しました。サンプルプロジェクトで流れをメモしておきます


やること

gradleを用いて既存プロジェクトのビルド、実行、ローカルのjarをクラスパスとして指定(コンパイル時及び実行時) 。Javaしか使わないことを想定しています。

プロジェクト構成

.
├── build
│   ├── fruit
│   │   ├── bara
│   │   │   └── Apple.class
│   │   └── mikan
│   │       └── Orange.class
│   └── main
│       └── Main.class
├── lib
│   └── hoge.jar
└── src
    ├── fruit
    │   ├── bara
    │   │   └── Apple.java
    │   └── mikan
    │       └── Orange.java
    └── main
        └── Main.java

lib/hoge.jarはコンパイル時と実行時にクラスパスに含めるライブラリです。

gradleの初期化

$ gradle init --type java-application
.
├── build
│   ├── fruit
│   │   ├── bara
│   │   │   └── Apple.class
│   │   └── mikan
│   │       └── Orange.class
│   └── main
│       └── Main.class
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lib
│   └── hoge.jar
├── settings.gradle
└── src
    ├── fruit
    │   ├── bara
    │   │   └── Apple.java
    │   └── mikan
    │       └── Orange.java
    ├── main
    │   ├── Main.java
    │   └── java
    │       └── App.java
    └── test
        └── java
            └── AppTest.java

ファイルがかなり増えました。build.gradleにはjavaプロジェクト用に色々書き込まれています。gradleが気を利かせてsrc/main/javaディレクトリを作成していますが必要ないので削除しておきます。testも必要がなければ削除します。

build.gradleをいじる

ソース、クラスファイルディレクトリ指定

ソースディレクトリとコンパイル後のクラスファイルが格納されるディレクトリを指定します。

sourceSets {
    main {
        java.srcDirs = ['src']
        java.outputDir = file('build')
    }
}

メインクラス指定

メイン関数のあるクラスを指定します。

mainClassName = 'main.Main'

依存ライブラリ指定

compile時とruntime時にそれぞれ依存ライブラリのクラスパスを指定します。

dependencies {
    // This dependency is found on compile classpath of this component and consumers.
    compile 'com.google.guava:guava:23.0'

    + compile fileTree(dir: 'lib', includes: ['hoge.jar'])

    + runtime files('lib/hoge.jar')

    // Use JUnit test framework
    testCompile 'junit:junit:4.12'
}

コンパイル、実行

$ gradle compileJava
$ gradle run  # 上のcompileJavaも含まれている