Gradle クラスパス・依存ライブラリを表示する

blog1.mammb.com


クラスパスと依存ライブラリの確認

-d オプション付きでビルドを行い、

$ ./gradlew clean
$ ./gradlew -d build

NormalizingJavaCompiler のログでコンパイラ引数の内容を確認できる。

... [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments:
 -source 21 -target 21
 -d .../app/build/classes/java\main
 -h .../app/build/generated/sources/headers/java/main
 -g
 -sourcepath .../app/src/main/java
 -proc:none
 -s .../app/build/generated/sources/annotationProcessor/java/main
 -classpath ...
 --module-path ...

-classpath の内容がクラスパスとして渡されるもので、--module-path の内容がモジュールパスとして渡されるもの(module-info.javaMANIFESTAutomatic-Module-Name エントリを扱わない場合は -classpath のみが使われる)。

同様に application プラグインにより、ランタイムの場合は、

$ ./gradlew -d run

DefaultExecHandle のログでランタイム時の引数内容を確認できる。

... [INFO] [org.gradle.process.internal.DefaultExecHandle] Starting process 
'command '...bin/java.exe''. 
Working directory: .../app 
Command: .../java.exe
 -Dfile.encoding=UTF-8
 -Duser.country=US
 -Duser.language=en
 -Duser.variant
 -cp ...
 com.example.hello.App

application プラグインの run で実行した場合、モジュラーアプリケーションでも、モジュールパス--module-path(-p) ではなく、クラスパス -cp が使われる(Gradle8.5時点)。


クラスパス内容の表示

以下のようなタスクを作成すれば、Gradle内部のクラスパスの内容を確認できる。

tasks.register<DefaultTask>("printPath") {

    println("-- compileClasspath")
    sourceSets["main"].compileClasspath.forEach(::println)
    
    println("-- annotationProcessorPath")
    sourceSets["main"].annotationProcessorPath.forEach(::println)
    
    println("-- runtimeClasspath")
    sourceSets["main"].runtimeClasspath.forEach(::println)
}

クラスパスに含まれる実態ファイルが表示できる。

$ ./gradlew printPath

-- compileClasspath
.../.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.14.0/1ed471194b02f2c6cb734a0cd6f6f107c673afae/commons-lang3-3.14.0.jar
.../.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-math3/3.6.1/e4ba98f1d4b3c80ec46392f25e094a6a2e58fcbf/commons-math3-3.6.1.jar

-- annotationProcessorPath

-- runtimeClasspath
.../app/build/classes/java/main
../app/build/resources/main
.../.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.14.0/1ed471194b02f2c6cb734a0cd6f6f107c673afae/commons-lang3-3.14.0.jar
.../.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-math3/3.6.1/e4ba98f1d4b3c80ec46392f25e094a6a2e58fcbf/commons-math3-3.6.1.jar

なお、Gradle8.5 時点では、モジュールパスはそれ自体でモデル化されておらず、それぞれのタスク実行時に JavaModuleDetector.java によりアドホックに判断される。

なので、実際にクラスパスかモジュールパスのどちらで扱われているかを判断するには、前述のデバッグログに頼るしかない。


依存ライブラリの確認

単にライブラリの依存定義だけ確認するには、以下のようなレイアウトの場合、

root
 ├ src
 ├ build.gradle.kts
 └ setting.gradle.kts

以下で表示できる。

$ ./gradlew dependencies


以下のレイアウトの場合、

root
 ├ app
 │   ├ src
 │   └ build.gradle.kts
 └ setting.gradle.kts

以下で表示できる。

$ ./gradlew app:dependencies
> Task :app:dependencies

------------------------------------------------------------
Project ':app'
------------------------------------------------------------

annotationProcessor - Annotation processors and their dependencies for source set 'main'.
No dependencies

compileClasspath - Compile classpath for source set 'main'.
+--- org.apache.commons:commons-lang3:3.14.0
\--- org.apache.commons:commons-math3:3.6.1

compileOnly - Compile-only dependencies for the 'main' feature. (n)
No dependencies

... 略
(n) - A dependency or dependency configuration that cannot be resolved.

特定の configuration に絞る場合は以下のように指定する。

$ ./gradlew app:dependencies --configuration implementation