src/main/javaとsrc/main/resourcesの役割とは?Spring Bootのプロジェクト構成をやさしく解説
新人
「Spring Bootのプロジェクトを作ったら、src/main/javaとsrc/main/resourcesというフォルダが出てきたんですが、それぞれどんな役割なんですか?」
先輩
「それはいいところに気がついたね。どちらもSpring BootやJavaの開発ではとても重要なフォルダなんだ。まずは全体のプロジェクト構成から見てみようか。」
新人
「はい、お願いします!」
1. Spring Bootで生成されるプロジェクト構成とは?
Spring Bootでは、Gradleでプロジェクトを作成すると、次のようなディレクトリ構成が自動で生成されます。この構成は、Javaの標準的なプロジェクトレイアウトに基づいており、開発効率とメンテナンス性を高める工夫がされています。
src/
└── main/
├── java/ ← Javaのソースコードを置く場所
└── resources/ ← 設定ファイルやテンプレートなどを置く場所
このように、src/main/javaとsrc/main/resourcesの2つが開発の中心になります。特に、Spring Bootではこの構成に従うことが前提となっているため、それぞれの役割をしっかり理解しておくことが大切です。
また、Gradleを使う場合も、この構成は自動的に認識されます。Mavenを使わずに開発する場合でも安心して使える構成です。
2. src/main/javaディレクトリの基本的な役割
src/main/javaは、Javaのソースコードファイルを格納するためのディレクトリです。この中に、@Controllerクラスやmainメソッドが含まれる起動クラスなどを配置します。
例えば、次のような構成になります:
src/
└── main/
└── java/
└── com/
└── example/
└── demo/
├── DemoApplication.java ← 起動用クラス(mainメソッド)
└── controller/
└── HelloController.java ← Webコントローラ(@Controller)
ここではcom.example.demoというパッケージを使っています。Javaでは、パッケージ名とフォルダ構成を一致させるのがルールなので、フォルダ名もそれに合わせて作成します。
DemoApplication.javaはSpring Bootのエントリーポイントで、アプリケーションを起動するためのコードが含まれます。以下はその例です:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
また、HelloController.javaのように、@Controllerを使って画面表示の処理を行うクラスもここに置きます。Spring Bootでは、src/main/javaにあるJavaファイルを自動でコンパイル・実行の対象として認識します。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/")
public String index() {
return "index";
}
}
このように、src/main/javaはJavaコード専用の場所として、Spring Bootアプリケーションのロジックを構築する中心的な役割を担っています。
3. src/main/resourcesディレクトリの役割
src/main/resourcesディレクトリは、Spring BootやJavaアプリケーションで使用されるリソースファイルを格納するための場所です。リソースとは、Javaのソースコードではないけれど、アプリケーションの動作に必要なファイルのことです。
例えば、アプリケーションの設定ファイル、HTMLテンプレート、CSS、JavaScript、画像、メッセージファイル(国際化対応)などがこれにあたります。
このディレクトリの特徴は、ビルド時に自動的にクラスパスへコピーされるという点です。つまり、Javaコードから簡単にアクセスできる場所として扱われます。
実際のディレクトリ構成は以下のようになります。
src/
└── main/
└── resources/
├── application.properties ← アプリケーション設定ファイル
├── static/ ← 静的ファイル(CSSや画像など)
├── templates/ ← HTMLテンプレート(Thymeleaf用など)
└── messages.properties ← メッセージ定義(国際化対応)
Spring Bootでは、この構成を自動的に認識して動作するため、開発者が特別な設定をしなくても、適切にファイルが読み込まれます。
4. application.propertiesやテンプレートファイルの配置場所
application.propertiesは、Spring Bootアプリケーションの動作に関する設定を記述するためのプロパティファイルです。これもsrc/main/resourcesに配置します。
例えば、ポート番号の変更やテンプレートのパス設定、データベース接続情報などが記述できます。以下はその例です。
server.port=8081
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.html
テンプレートファイルは、Thymeleafなどのテンプレートエンジンを使用する場合、src/main/resources/templatesに配置します。Spring Bootはこのパスをデフォルトで探してくれるため、特別な設定がなくてもHTMLファイルが読み込まれます。
src/
└── main/
└── resources/
└── templates/
└── index.html
静的ファイル(画像・CSS・JS)は、src/main/resources/staticに置くことで、Spring Bootが自動的に公開してくれます。たとえば、static/images/logo.pngを配置すれば、/images/logo.pngでアクセスできます。
5. Javaとリソースの関係性(ビルド時の動作など)
Spring BootやJavaでは、src/main/javaとsrc/main/resourcesのファイルが、Gradleのビルドによってbuild/classes/java/mainにまとめられます。そして、実行時はこの出力ディレクトリがJavaのクラスパスになります。
つまり、Javaコードからリソースファイルを読み込むとき、Spring Bootは自動的にsrc/main/resources内のファイルを探してくれます。たとえば、プロパティファイルやHTMLテンプレートは明示的にパスを指定しなくても読み込まれるのです。
次のようにコードからリソースを読み込むことも可能です。
InputStream is = getClass().getClassLoader().getResourceAsStream("config/sample.properties");
これは、src/main/resources/config/sample.propertiesにあるファイルを読み込んでいる例です。
Javaとリソースの関係性を理解しておくことで、ビルド後の構成やファイルアクセスの仕組みを正しく把握できます。
特に初心者がつまずきやすいのが、リソースのパスを間違えてファイルが見つからないエラーです。こういったエラーを防ぐためにも、src/main/resourcesに置いたファイルは、パスを省略して読み込まれる仕組みを知っておくことが大切です。
Spring Bootはこの標準的なプロジェクト構成に基づいて動作しているため、正しい場所にファイルを置くことで、自動的に設定やテンプレートを適切に読み込んでくれます。
6. Spring Bootでのsrc/main/javaとsrc/main/resourcesの連携
Spring Bootでは、src/main/javaとsrc/main/resourcesが密接に連携して動作します。たとえば、コントローラクラスがHTMLテンプレートを返すときには、Javaコード(src/main/java)とテンプレートファイル(src/main/resources)がセットで動作します。
たとえば、@Controllerで定義したJavaクラスのreturn "index"という記述は、src/main/resources/templates/index.htmlというテンプレートを探すという意味になります。これがSpring Bootの自動構成の特徴です。
@Controller
public class HelloController {
@GetMapping("/")
public String index() {
return "index"; // templates/index.html を探して返す
}
}
このように、Javaコードとresourcesフォルダ内のファイルは、それぞれ独立したものではなく、アプリケーションとして動作するために協力し合っているのです。
7. よくあるトラブルとその原因(ファイルのパスが通らないなど)
初心者が最もよくつまずくのが、resourcesフォルダに置いたファイルが読み込めないというトラブルです。これは主に以下のような原因があります。
- Javaコードで指定するファイル名やパスが間違っている
- resourcesにファイルを置いたが、Gradleビルドで含まれていない
- ディレクトリ構成が想定と異なる場所に配置されている
例えば、次のように設定ファイルを読み込むコードを書いたのに、ファイルが見つからないというエラーが発生するケースです。
InputStream is = getClass().getClassLoader().getResourceAsStream("config/sample.properties");
このコードは、src/main/resources/config/sample.propertiesを探しますが、もしresources直下にsample.propertiesを置いていた場合、読み込みに失敗します。
このような時は、ディレクトリ構成を見直すか、パスを正しく指定することが大切です。
src/
└── main/
└── resources/
└── config/
└── sample.properties
また、HTMLテンプレートのパスを返す時も、ファイル名の拡張子は不要ですが、templates配下にファイルが存在していないとエラーになります。
エラー例:
Whitelabel Error Page
There was an unexpected error (type=Not Found, status=404).
このようなエラーは、ファイルの場所や名前のミスが原因であることが多いため、ディレクトリ構成とJavaコードの対応関係をしっかり確認することが大切です。
8. どんな時にどちらにファイルを置くべきかの判断基準
Spring Bootの開発では、「Javaコードはsrc/main/javaに、設定やテンプレートなどのリソースはsrc/main/resourcesに」というルールを覚えておけば、迷うことは少なくなります。
以下に、よく使うファイルとそれを置くべき場所の例を整理します。
- コントローラクラス、サービスクラス、エンティティクラスなど: →
src/main/java - application.properties、application.yml: →
src/main/resources - HTMLテンプレート: →
src/main/resources/templates - CSS、JavaScript、画像: →
src/main/resources/static - 国際化のメッセージファイル: →
src/main/resources/messages.properties
このように、役割に応じて明確に配置する場所が決まっているため、ルールに従って整理された構成にしておくと、後で修正やメンテナンスがしやすくなります。
また、Spring Bootではこれらのフォルダ構成を前提にアプリケーションが動作するため、カスタマイズを加えない限りは、標準の場所にファイルを置くことがベストです。
設定ファイルの読み込みに失敗したり、テンプレートが表示されなかったりする原因の多くは、こうしたファイル配置のルールを守っていないことが原因です。
初心者のうちは、Spring Bootが想定している構成をそのまま使うことで、余計なトラブルを避けられ、学習や開発に集中することができます。