📚
【技術覚書】Spring bootプロジェクトにNext.jsアプリを含める時のpom.xml
はじめに
とある理由でバックエンドはSpring Boot
、フロントエンドはNext.js
、ビルドにはMaven
を使って開発します。
ビルドの負担を軽くしたかったので、Next.js
ではレンダリング方法をStatic Site Generationとして作成し、出来上がった静的リソースファイルをSpring Bootプロジェクトのtargetフォルダにコピーします。
この記事はその覚書です。
Next.js
にはいくつかのレンダリング方法があるようです。
シナリオ
- バックエンドはRESTFul Web Serviceとして作成しておく
- ローカルでバックエンドを動かしながら、フロントエンドを作りこむ体
- パッケージングは一番最後
- Spring Bootのプロジェクト内にNext.jsアプリ用サブフォルダfrontappを作成
- パッケージング
mvn package
の際にnpm run build
を実施し、frontapp/outフォルダに作成した静的ファイルをclasspath:staticフォルダにコピーしてSpring Boot
のjarファイルを作成
使用したversion
名称 | バージョン |
---|---|
node.js | v18.20.4 |
npm | 10.7.0 |
spring boot | 3.4.0 |
Java | 17 |
pom.xml
最初はmaven-resources-plugin
を使って静的リソースファイルをコピーを試みたのですがNext.js
が生成する_next
フォルダがコピーできない事象に遭遇したのでmaven-antrun-plugin
を利用することにしました。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.15.0</version>
<configuration>
<workingDirectory>frontapp</workingDirectory>
</configuration>
<executions>
<execution>
<id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>${node.version}</nodeVersion>
<npmVersion>${npm.version}</npmVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
</configuration>
</execution>
<execution>
<id>npm run build</id>
<goals>
<goal>npm</goal>
</goals>
<phase>prepare-package</phase>
<configuration>
<arguments>run build</arguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>copy-frontend-resources</id>
<phase>prepare-package</phase>
<configuration>
<tasks>
<copy todir="${project.build.directory}/classes/static">
<fileset dir="${project.basedir}/frontapp/out" includes="**/*"/>
</copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
next.config.ts
上記が動くようにnext.config.ts
にも修正が必要です。
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
/* config options here */
output: 'export',
};
export default nextConfig;
まとめ
特になし
Discussion