Gradleを学ぶ際によく使われる依存関係とは
はじめに
自分自身Javaを初学者として学ぶ際(今も)に、ビルドという言葉をよく目にした。
ビルド自体よくわからなかったが、更に出てくるのがGradle(もしくはMaven)で、依存関係の解消ツール、といった説明をよくされていた。
あまりイメージできなかったため、Javaを例にしながら依存関係・ビルドをまとめる。もし不備あれば訂正いただけると幸いです。
そもそもビルドとは
ビルドとはなにか?~コンパイル・リンクとの違いを解説~によるとビルドとは、「ソースファイルから最終的な実行ファイルを作成すること」とのこと。これにはコンパイル・リンク(プログラムファイル(オブジェクトファイル・ライブラリ)を組み合わせて実行ファイルに変換すること)も含まれる。
Javaで例えると、XXX.javaファイル作成→コンパイル→XXX.classにするといった実行可能なソースを作成するイメージ。
依存関係とは?
依存関係とその煩雑さをイメージする際に、Javaのクラスパス設定を理解するとわかりやすい。
クラスパスの復習
JavaのコンパイラやJVMは、指定されたクラスパス上から必要な.javaや.classファイルを探してコンパイルや実行を行う。
例(コンパイルを例にしているが実行時も考え方は同じ):仮にsrc配下にmainフォルダがあり、そこにMain.javaがあるとする。
cd src/main #src/mainに移動
javac Main.java #見覚えあるやつ
この時、クラスパスを指定していないが、その場合はカレントディレクトリからMain.javaを探す。
クラスパスを指定すると以下のような記述になる。
javac -cp . Main.java #カレントディレクトリをクラスパスとして指定
今の例はクラスパスを指定しなくても良い例だったが、指定する必要がある例をあげる。
src/main/subというディレクトリがあり、そこにSub.javaを作成したとする。
そして、Main.javaにSubクラスをインスタンス化する記述を追記する。
public Main class {
public static void main(args[]){
Sub sub1 = new Sub();
}
}
この時、はじめの例と同様、以下コマンドを実行するとエラーとなる。
cd src/main #src/mainに移動
javac Main.java #実行時エラー
なぜかというと、クラスパスがsrc/mainにしか通っておらず、Main.javaでインスタンス化しているSubクラスをコンパイラは見つけられないためである。
修正後は以下。
javac -cp .;./sub Main.java #カレントディレクトリ(main),subをクラスパスとして指定
このように、javaをコンパイル・実行する際はクラスパスを意識する必要がある。
また詳細は省略するが、標準ライブラリでないパッケージをimportする際にもクラスパスを指定する必要がある。(ちなみにjava.utilなどの標準ライブラリは勝手にクラスパスが通っているらしい)
依存関係とその管理の煩雑さ
上記の例のような、そのファイルを実行する際に他のファイルが必要な状態を依存していると私は理解している。
例では、2ファイルしか必要なかったが、そのようなプログラムは稀であり、かつ外部のライブラリからimportした場合など、クラスパスを通すことを考えるだけでも非常に手間である。
そのような依存関係を簡単にしてくれるのがGradleなどのツールであると理解。
これからお勉強するので、Gradleについてはまた記載する。
Gradleのとっかかりとしては、以下がわかりやすそう。
初めてのgradle build(Java)
最後に
GPTに添削を頼んだ際に、Gradleの役割について以下という回答を得た。奥が深そうだ・・・。
Gradle(やMaven)は単に「依存関係を解消する」だけでなく、コンパイル、テスト、パッケージング、デプロイといったビルドプロセス全体を自動化するツール
Discussion