Spring bootアプリケーションをMavenでjar化し実行した際のエラーとか

バージョン情報
Spring boot version 2.1.1.RELEASE
Maven 3.6
javaコマンドで実行するJar実行ファイルを作成する。

mvn clean package コマンドでSpringアプリケーションをjar化。
jar化したアプリケーションをjava -jar MyApp.jar で実行してみると実行時エラーとなった。

実行時エラー その1

MyApp.jarにメイン・マニフェスト属性がありません。
あらら・・・?そんな初歩的な。MANIFEST.MFくらい勝手にうまいこと作ってくれると思ってたのに・・・。Jar展開してみたらたしかにMANIFEST.MFにメインクラスの記載がない・・・。

pom.xmlにMANIFEST宣言を追加してみる。

<build>
  <plugins>
    ...
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>net.rizworks.app.MyBatchApplication</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
    ...

mvnコマンド再実行。これでjar内のMANIFEST.MFにメインクラスが追加された。

実行時エラー その2 固める際の忘れもの

Exception in thread “main” java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
今度はどうやらSpring bootを起動させるための資材が見当たらない模様。っていうかjarの中身確認したら、その他必要な依存ライブラリjarが1個も入ってないやん。

依存パッケージをすべてパッケージングするようpomを書き変えてmvnを再実行。

  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>net.rizworks.app.MyBatchApplication</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-myapp-jar</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...

goalなどの記載はmaven-assembly-pluginの仕様に従う。これで1つのjarの中に必要なライブラリがすべて固まった。

実行時エラー その3 それでもやっぱり動かない

2019/03/05 13:35:58.963 [DEBUG ] 
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::
...
...
...
2019/03/05 13:35:59.342 [ERROR ] o.s.b.SpringApplication Application run failed
java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.

えー。ダメかよ・・・。なんでだろ・・・?ってところでそもそも論に気付く。
pomに書かれてるはずのspring-boot-maven-pluginでspring bootアプリケーションってjar化するんじゃ・・・?なんで当初記載のなかったmaven-jar-pluginが使われてしまってたんだろう。
調べた結果、mvn実行時にspring-boot-maven-pluginを指定する方法があった。

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <!-- ここから -->
    <executions>
      <execution>
        <goals>
          <goal>repackage</goal>
        </goals>
      </execution>
    </executions>
    <!-- ここまで -->
  </plugin>

spring-bootのmavenプラグインに実行指定を追加。
たったこれだけ。これだけでSpring bootアプリ起動しました。
さすがSpring boot。よくできてる。
その1、その2で追加したPluginの記載とかまったくいらんかったです。すいません。
ってことでSpring boot / Mavenの再学習終了の巻。

コメントを残す

メールアドレスが公開されることはありません。