线程“main”java.lang.classnotfoundexception中的异常-springboot,多模块gradle项目

wdebmtf2  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(410)

我知道这是一个常见的问题,我很不好意思问这个问题,但我不明白为什么我不能加载我的多模块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 文件在这里是正确的,但似乎不是。还有什么我可能错过的吗?

tzdcorbm

tzdcorbm1#

根据gradle文档,您可以尝试添加 'application' 插件。
https://docs.gradle.org/current/userguide/application_plugin.html

plugins {
    id 'application'
}
application {
    mainClass = 'space.forloop.addon.app.Main'
}
wsxa1bj1

wsxa1bj12#

您以错误的方式使用了spring引导插件。这是一个很常见的错误,我认为他们需要更好地记录它,或者只是让它开箱即用。哦,好吧。
在gradle多项目中,通常先定义支持库,然后定义一个或多个可运行或可部署的应用程序。
从您的描述中,有一点我无法判断,那就是您是打算让根项目构建最终的应用程序,还是应该让它成为最终的应用程序 addon-sync-app 项目。鉴于这个名字,我假设是后者,但它可以是其中之一(但通常不能同时是两者)。
当您将spring引导插件应用于一个项目(不管它是根项目还是子项目),并且依赖于默认值时,它将把该项目变成一个“胖jar”,这需要一个特殊的类加载器来运行。这使得它不适合作为一个普通的图书馆。因此,当您试图以正常方式依赖它时,将找不到您的类。
要修复它,您应该只将spring引导插件应用于构建最终应用程序jar的项目。如果是的话 addon-sync-app ,然后将其从根项目和所有非应用程序子项目中删除。
相反,如果您希望根项目生成最终的应用程序,则需要创建对所有必需子项目的依赖关系,并像以前一样,从这些子项目中删除spring引导插件。
当不应用spring引导插件时,会丢失一件事,那就是对bom的自动依赖性,bom定义了依赖性的默认版本。如果您希望继续使用它而不创建库的胖jar,那么有几种不同的方法来处理它。我在这里写了一个(有点太长)答案。

相关问题