事象
ビルド時は問題ないがjarファイルにして起動すると実行時にClassNotFoundException
エラーが発生。
ただし、エラーが発生しない画面もある
inteliJからlocalで起動している場合は、エラー発生なし
環境
ビルドツール: Gradle(6.7.1)
言語: Kotlin(1.3.72)
再現手順
jarを生成した後、起動
terminal
java -jar awba-manage-0.0.1-SNAPSHOT.jar
その後、画面を動作させてみると一部ページでエラーが発生。
ログをみる
ログ
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/lang3/RandomStringUtils] with root cause
java.lang.ClassNotFoundException: org.apache.commons.lang3.RandomStringUtils
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[na:na]
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92) ~[awba-manage-0.0.1-SNAPSHOT.jar:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
at com.awba.manage.awbamanage.service.EmailSenderService.sendForgotPasswdMail(EmailSenderService.kt:83) ~[classes!/:na]
at com.awba.manage.awbamanage.controller.LoginController.forgotPasswdSendMail(LoginController.kt:95) ~[classes!/:na]
at com.awba.manage.awbamanage.controller.LoginController$$FastClassBySpringCGLIB$$accc0aa.invoke(<generated>) ~[classes!/:na]
調査開始
RandomStringUtilsというクラスが見つからないというのでエラーが出ている。
jarファイルの中身を確認すると確かに該当のjar(commons-lang3:3.5.jar)がない
jarファイルの中身を確認
jar -tf awba-manage-0.0.1-SNAPSHOT.jar
とりあえず以下手順を実施し、一度きれいにして再度buildして起動したが変わらず。。
terminal
gradle clean
# cacheディレクトリも削除↓
# %ユーザのホームフォルダ%\.gradle\caches
build.gradleをみると・・・
build.gradle.kts
compileOnly("org.apache.commons:commons-lang3:3.11")
原因
build.gradleで該当のライブラリの宣言部分をcompileOnly
にしていたため。
compileの時にのみ必要なライブラリとなり、jarファイルには含まれない。
対応
implementation
で宣言する
build.gradle.kts
implementation("org.apache.commons:commons-lang3:3.11")