Spring boot Spring启动可执行文件-主应用程序类的classnotfound错误

Spring boot Spring启动可执行文件-主应用程序类的classnotfound错误,spring-boot,gradle,jar,Spring Boot,Gradle,Jar,下面是我的build.gradle-我没有在生成的boiler plate代码上编写任何java代码-我的问题是,在分解分发文件夹下生成的tar文件并运行可执行jar(使用分发文件夹中可以找到的脚本)之后,我得到了主应用程序类的classnotfound异常: 错误:无法找到或加载主类com.itreatmd.emr.emrServices.EmrServicesApplication 原因:java.lang.ClassNotFoundException:com.itreatmd.emr.em

下面是我的build.gradle-我没有在生成的boiler plate代码上编写任何java代码-我的问题是,在分解分发文件夹下生成的tar文件并运行可执行jar(使用分发文件夹中可以找到的脚本)之后,我得到了主应用程序类的classnotfound异常:

错误:无法找到或加载主类com.itreatmd.emr.emrServices.EmrServicesApplication 原因:java.lang.ClassNotFoundException:com.itreatmd.emr.emrServices.EmrServicesApplication

我查了一下lib文件夹,确实在里面找到了我的胖罐子。如果我分解fat jar来搜索主应用程序类,我会发现它列为:BOOT-INF/classes/com/itreatmd/emr/emrServices/EmrServicesApplication.class

但是,我没有看到任何spring引导加载程序类。在脂肪罐里

我想我需要修改build.gradle来纠正这个问题,但我无法找到解决方案

    plugins {
            id 'org.springframework.boot' version '2.2.2.BUILD-SNAPSHOT'
            id 'io.spring.dependency-management' version '1.0.8.RELEASE'
            id 'java'
            id 'distribution'
            id 'application'
    }

    group = 'com.itreatmd.emr'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '11'

    mainClassName = 'com.itreatmd.emr.emrServices.EmrServicesApplication'
    repositories {
            mavenCentral()
            maven { url 'https://repo.spring.io/milestone' }
            maven { url 'https://repo.spring.io/snapshot' }
    }

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-loader'
    implementation 'org.springframework.boot:spring-boot-starter-jersey'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}    
    bootJar {
        manifest {
            attributes 'Implementation-Title': 'Gradle Quickstart',
                       'Implementation-Version': version,
                       'Main-Class': 'com.itreatmd.emr.emrServices.EmrServicesApplication'
        }
    }
    test {
            useJUnitPlatform()
    }

我的问题的答案是,在最近的SprintBoot版本中,构建/分发文件夹是无用的。当我从旧的SpringBoot版本迁移到最近的2.x版本时,我假设我可以继续从build/distribution文件夹中的TAR中提取JAR并继续(TAR在打包和分发方面有一些优点)。但是,您在发行版下的tar爆炸中发现的脚本被破坏了。因此,只需使用bootScripts下的脚本即可继续。

为什么要直接从发行版运行jar文件?应用程序插件创建的发行版可以为Windows和Unix类平台创建脚本,这些脚本应该用于运行应用程序。是的,我正在发行版中使用该脚本来运行应用程序。我没有直接运行jar。Andy,你知道脚本如何从BOOT-INF/classes加载类吗,因为在我的例子中,它根本无法这样做?我没有更改版本在分发文件夹中生成的脚本。您正在尝试使用哪个分发版本?Spring Boot的插件应该包括fat jar。fat jar的内容包括:META-INF/META-INF/MANIFEST.MF Boot-INF/Boot-INF/classes/com/Boot-INF/classes/com/itreatmd/Boot-INF/classes/com/itreatmd/emr/Boot-INF/classes/com/itreatmd/emr/emrServices/BOOT-INF/classes/com/itreatmd/emr/emrServices/EmrServicesApplication.class BOOT-INF/lib/。。。BOOT-INF/lib/spring-BOOT-starter-2.2.1.RELEASE.jar BOOT-INF/lib/spring-BOOT-loader-2.2.1.RELEASE.jar BOOT-INF/lib/spring-BOOT-2.2.1.RELEASE.jar。。。。