Spring Bootプロジェクトを作成し、mvn clean package
コマンドを実行すると、targetディレクトリ内に以下のように.original
ファイルが作成されています。
これはなんぞや、ということで調べてみました。
.original
ファイルはただのJarもしくはWar
はい、ただのJarファイル、Warファイルです。
Spring BootはExecutable Jar(War)を作成することができます。
この形式になっているのが、.original
ではない方のJarやWarです。
.original
はExecutableではない、ただのJarやWarということです。
JarやWarを解凍して中身を比較するとわかりますが、Executable Jar (War) は実行に必要なSpring Boot関連のクラスを含んでいたり、ディレクトリ構成が異なっていたりします。
詳細は公式ドキュメントに説明があります。
https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html
Spring Boot Maven Pluginが作っている
このファイルはSpring Boot Maven Pluginが作成しています。
このPluginにはspring-boot:repackage
というゴールがあり、ここでExecutable Jar (War) を作成し、もともとMavenでpackageされていたJarやWarを.original
という名称にリネームしています。
なぜ、mvn clean package
という感じに、spring-boot:repackage
を指定していないのに作成されてしまうのかというと、spring-boot-starter-parentのpom.xmlに以下のような設定が行われているからです。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>${start-class}</mainClass>
</configuration>
</plugin>
repackage
はpackage
フェーズで実行されるので、mvn clean package
すれば、repackage
も実行されます。
.original
ファイルを作成しないようにするためには
Executable Jar (War) を作成する必要があるのであれば、.original
ファイルは必ず作成されてしまいます。
しかし、ただのJarやWarを作成するだけにしたいのであれば、以下のいずれかでExecutable Jar (War) の作成をスキップできます。
- コマンドの引数で指定する場合
mvn clean package -Dspring-boot.repackage.skip=true
- pom.xmlで設定する場合
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
.original
ファイルの使いみち
組み込みTomcatを利用せず、Warファイルをアプリケーションサーバにデプロイする運用なのであれば、Executable Warである必要はありません。
(もちろん、Executable Warでもデプロイは可能です。)
Executable Warは、実行するために必要なSpring Bootのクラスや、Mavenでprovidedスコープにしたライブラリも含んでいるため、通常のWarファイルよりもファイルサイズが大きくなりがちです。
そのため、このような運用を行っている場合であれば、.original
ファイルをデプロイしたり、上述の設定を行って、Executable Warを作成しないようにすることで、ファイルサイズを抑えることができます。
ただ、javaコマンドでサクッと実行できるのがSpring Bootの良さだと思いますけど。