WAR 文件:无法找到或加载主文件 class,但它在那里

WAR file: Could not find or load main class, but it’s there

我已经使用 Intellij IDEA 构建了一个 WAR 归档工件,其中包含一个用 Kotlin 编写的 Spring Boot MVC 应用程序。

相关内容如下:

$ jar tvf application.war
...
1649 [timestamp] WEB-INF/classes/org/domain/apps/App00HelloMvcKt.class
2087 [timestamp] WEB-INF/classes/org/domain/apps/App00HelloMvc.class
...

App00HelloMvcKt 包含 fun main(...)App00HelloMvc 是 Spring 引导应用程序 class。

MANIFEST.MF 包含 Main-Class 条目:

Main-Class: org.domain.apps.App00HelloMvcKt

但是,当我运行它的时候,出现了问题:

$ java -jar application.war
Error: Could not find or load main class org.domain.apps.App00HelloMvcKt
Caused by: java.lang.ClassNotFoundException: org.domain.apps.App00HelloMvcKt

据我所知,有了这个目录结构,就不需要额外摸索 class 路径了。那为什么不能运行?


附加信息:这是一个教学项目。我正在尝试从 Spring 带有嵌入式 Tomcat 的引导 MVC 应用程序提供 .jsp 页面。根据互联网,此设置仅在您将应用程序打包为 WAR 和 运行 时才有效 java -jar.

jar 文件只是一个 zip 文件,zip -l application.war 也是如此,并确保你的 App00HelloMvcKit class 在那里,你的 MANIFEST.MF在正确的地方。其中一件事情可能是不正确的,所以修正它。

如果您无法理解,post 上述命令的输出对您的问题的编辑。

很可能 IntelliJ "Web Application: Archive" 不完全理解 Spring 引导语义。尝试用 Maven Spring Boot Plugin, as in explained in chapter 68.2 Packaging Executable Jar and War Files:

打包 WAR
$ mvn clean package spring-boot:repackage
$ java -jar target/application.war