我知道这是一个常见的问题,我很不好意思问这个问题,但我不明白为什么我不能加载我的多模块springboot应用程序的主类。
完整堆栈跟踪:
Exception in thread "main" java.lang.ClassNotFoundException: space.forloop.addon.app.Main
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:107)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
a有根级别 gradle.build
文件
plugins {
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
repositories {
mavenCentral()
}
bootJar {
mainClass = 'space.forloop.addon.app.Main'
}
def javaProjects = [
'addon-sync-app',
// Removed, not important
]
javaProjects.each {
name ->
project(":$name") {
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java'
repositories {
// Removed, not important
}
dependencies {
// Removed, not important
}
}
}
在包模块中 addon-sync-app
我还有一个 build.gradle
只有以下内容的文件:
apply plugin: 'org.springframework.boot'
dependencies {
// Removed, not important
}
查看配置主类的文档,我确信添加了:
bootJar {
mainClass = 'space.forloop.addon.app.Main'
}
到根 gradle.build
文件在这里是正确的,但似乎不是。还有什么我可能错过的吗?
2条答案
按热度按时间tzdcorbm1#
根据gradle文档,您可以尝试添加
'application'
插件。https://docs.gradle.org/current/userguide/application_plugin.html
wsxa1bj12#
您以错误的方式使用了spring引导插件。这是一个很常见的错误,我认为他们需要更好地记录它,或者只是让它开箱即用。哦,好吧。
在gradle多项目中,通常先定义支持库,然后定义一个或多个可运行或可部署的应用程序。
从您的描述中,有一点我无法判断,那就是您是打算让根项目构建最终的应用程序,还是应该让它成为最终的应用程序
addon-sync-app
项目。鉴于这个名字,我假设是后者,但它可以是其中之一(但通常不能同时是两者)。当您将spring引导插件应用于一个项目(不管它是根项目还是子项目),并且依赖于默认值时,它将把该项目变成一个“胖jar”,这需要一个特殊的类加载器来运行。这使得它不适合作为一个普通的图书馆。因此,当您试图以正常方式依赖它时,将找不到您的类。
要修复它,您应该只将spring引导插件应用于构建最终应用程序jar的项目。如果是的话
addon-sync-app
,然后将其从根项目和所有非应用程序子项目中删除。相反,如果您希望根项目生成最终的应用程序,则需要创建对所有必需子项目的依赖关系,并像以前一样,从这些子项目中删除spring引导插件。
当不应用spring引导插件时,会丢失一件事,那就是对bom的自动依赖性,bom定义了依赖性的默认版本。如果您希望继续使用它而不创建库的胖jar,那么有几种不同的方法来处理它。我在这里写了一个(有点太长)答案。