はじめに (対象読者・この記事でわかること)
この記事は、Spring Boot CLIを使用してGroovyファイルを実行する際にtemplatesフォルダが読み込まれない問題に直面しているJava開発者を対象としています。特に、Spring BootのCLIツールを使った開発に慣れていない方や、Thymeleafなどのテンプレートエンジンを使ったWebアプリケーション開発を試みている方に役立つ内容です。この記事を読むことで、Spring Boot CLIでGroovyファイルを実行する際のtemplatesフォルダの読み込み問題の原因を理解し、適切な解決策を適用できるようになります。また、Spring Bootの基本的な動作原理についても深く理解することができます。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 - Javaプログラミングの基本的な知識 - Spring Bootの基本的な概念と使い方 - Groovy言語の基本的な構文 - Thymeleafなどのテンプレートエンジンの基本的な使い方 - コマンドラインインターフェース(CLI)の基本的な操作
Spring Boot CLIとGroovyファイルの概要
Spring Boot CLIは、Spring Bootアプリケーションを迅速に開発するためのコマンドラインツールです。Groovyという動的なプログラミング言語を使用して、簡潔なコードでアプリケーションを開発できます。特に、Groovyの「スクリプトとして実行可能」という特性を活かして、簡単なWebアプリケーションを迅速にプロトタイピングするのに適しています。
templatesフォルダは、Spring Bootアプリケーションでテンプレートエンジン(Thymeleafなど)を使用する際に、HTMLテンプレートファイルを配置する場所です。通常、Spring Bootは自動的にクラスパス上のtemplatesフォルダを認識し、テンプレートファイルの読み込みを行います。
しかし、Spring Boot CLIでGroovyファイルを実行する際には、このtemplatesフォルダが正しく読み込まれないことがあります。これは、Spring Boot CLIがGroovyファイルをコンパイルして実行する際のクラスパスの設定に起因する問題です。
Spring Boot CLIでGroovyファイル実行時のtemplatesフォルダ読み込み問題とその解決策
問題の再現
まず、問題を再現するための簡単なGroovyファイルを作成してみましょう。以下のようなhello.groovyファイルを作成します。
Groovy@Controller class HelloController { @RequestMapping("/") String home() { return "hello" } }
そして、同じディレクトリにtemplatesフォルダを作成し、その中にhello.htmlファイルを配置します。
Html<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Hello Spring Boot</title> </head> <body> <h1>Hello, Spring Boot!</h1> </body> </html>
この状態で、Spring Boot CLIを使用してGroovyファイルを実行してみます。
Bashspring run hello.groovy
正常に動作すれば、ブラウザでhttp://localhost:8080にアクセスすると"Hello, Spring Boot!"と表示されるはずです。しかし、実際にはテンプレートが見つからないというエラーが発生することがあります。
原因の調査
この問題の原因は、Spring Boot CLIがGroovyファイルをコンパイルして実行する際のクラスパスの設定にあります。デフォルトの設定では、Spring Boot CLIはGroovyファイルと同じ階層にあるフォルダをクラスパスに含めてくれません。その結果、templatesフォルダがクラスパスに含まれず、テンプレートエンジンがテンプレートファイルを見つけることができません。
ハマった点やエラー解決
この問題に直面した際、多くの開発者は以下のようなエラーメッセージに遭遇します:
TemplateResolutionException: Template "hello" not found (please check your template location path, "templates/" is the default)
このエラーメッセージは、テンプレートエンジンが指定されたテンプレートファイルを見つけられなかったことを示しています。原因は、先述の通りtemplatesフォルダがクラスパスに含まれていないことです。
また、この問題はGroovyファイルを直接実行する場合にのみ発生します。通常のSpring Bootアプリケーション(MavenやGradleを使用したもの)では、このような問題は発生しません。これは、通常のSpring Bootアプリケーションではビルドプロセスが正しくクラスパスを設定しているのに対し、Spring Boot CLIは簡易的な実行を行うため、クラスパスの設定が不十分であることが原因です。
解決策
この問題を解決するには、いくつかの方法があります。
解決策1:--templatesオプションの使用
Spring Boot CLIには、--templatesオプションがあります。このオプションを使用することで、明示的にテンプレートフォルダを指定できます。
Bashspring run hello.groovy --templates=templates
このコマンドを実行すると、Spring Boot CLIは指定されたtemplatesフォルダをクラスパスに含めてくれます。
解決策2:spring-boot-app-mavenプラグインの使用
より本格的な開発を行いたい場合は、spring-boot-app-mavenプラグインを使用することもできます。このプラグインは、GroovyファイルをMavenプロジェクトとして扱うことができます。
まず、pom.xmlファイルを作成します。
Xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-app-maven-plugin</artifactId> <version>0.5.0</version> <executions> <execution> <goals> <goal>build-info</goal> <goal>build-x</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
次に、Groovyファイルをsrc/main/groovyディレクトリに配置し、テンプレートファイルをsrc/main/resources/templatesディレクトリに配置します。そして、以下のコマンドでアプリケーションを実行します。
Bashmvn spring-boot-app:run
この方法では、Mavenが正しくクラスパスを設定してくれるため、templatesフォルダが正しく読み込まれます。
解決策3:Groovyスクリプト内での明示的な設定
Groovyスクリプト内で、テンプレートの場所を明示的に設定することもできます。
Groovy@Controller class HelloController { @RequestMapping("/") String home() { return "hello" } } // テンプレートの場所を明示的に設定 def ctx = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/spring-app.xml") def templateResolver = ctx.getBean("templateResolver") templateResolver.setTemplateMode("HTML5") templateResolver.setPrefix("classpath:/templates/") templateResolver.setSuffix(".html") templateResolver.setCacheable(false)
ただし、この方法ではSpring Bootの自動設定機能を一部無効にしてしまうため、推奨される方法ではありません。
まとめ
本記事では、Spring Boot CLIでGroovyファイルを実行する際にtemplatesフォルダが読み込まれない問題について解説しました。この問題は、Spring Boot CLIがGroovyファイルをコンパイルして実行する際のクラスパスの設定に起因するものであり、--templatesオプションの使用やspring-boot-app-mavenプラグインの利用、Groovyスクリプト内での明示的な設定など、いくつかの解決策があります。
この記事を通して、Spring Boot CLIの基本的な使い方と、テンプレートエンジンを使用したWebアプリケーション開発のポイントを理解できたことと思います。今後は、より高度なSpring Bootアプリケーションの開発についても記事にする予定です。
参考資料
- Spring Boot CLI Documentation
- Spring Boot with Groovy
- Thymeleaf with Spring Boot
- Spring Boot App Maven Plugin
