SpringBoot 启动 Scala 项目:NoClassDefFoundError

今天尝试将一个 scala 项目转为 springboot 项目时,出现了无法找到主类的报错,现象如下:

  1. 在 IDEA 里面新建 SpringBoot 启动配置,运行后启动成功。
  2. 在 POM 目录 执行 mvn spring-boot:run 运行项目,启动成功;
  3. 线下环境 通过 java -jar jar_name.jar,运行成功;
  4. 线上脚本启动时(事实上也是运行的 java -jar…),抛出异常:
1
2
3
4
5
6
7
Exception in thread "main" java.lang.NoClassDefFoundError: me.tangye.springboot.Application
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more

我排查了几遍路径,同时也登录了机器解包看了,这个 Class 的确是在的。通过查看 spring-boot 的文档得知,需要加上 scala-maven-plugin 这个插件才可以。

这是有问题的 build 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<build>
<finalName>springboot-demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<mainClass>me.tangye.springboot.Application</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

spring-boot-maven-plugin 加上下面的 plugin:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>

SpringBoot 启动 Scala 项目:NoClassDefFoundError

https://ittang.com/2018/02/01/springboot-with-scala/

作者

Yves

发布于

2018-02-01

更新于

2018-02-01

许可协议