【问题标题】:Spring Boot Application Deployment IssueSpring Boot 应用程序部署问题
【发布时间】:2020-08-28 10:30:39
【问题描述】:

朋友们好,

我是 Spring Boot 框架的新手。我已经完成了简单的 Spring Boot 应用程序,所以我将在我的服务器中部署 Spring 应用程序(Windows 10 64 位)

我使用 Gradle 作为我的项目构建工具

我正在尝试使用以下命令获取 Jar / War 文件

./gradlew war

./gradlew bootWar

./gradlew bootJar

我已成功获取 Jar/War 文件,但我正在尝试使用以下命令运行该文件

java -jar application.jar

但我收到以下错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
        at com.darefriends.daregames.DaregamesApplicationKt.main(DaregamesApplication.kt:17)
        ... 8 more
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 org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:129)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 9 more

Gradle 文件:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile



plugins {
    `java`
    `idea`
    id("org.springframework.boot") version "2.3.0.RC1"
    id("io.spring.dependency-management") version "1.0.9.RELEASE"
    war
    kotlin("jvm") version "1.3.72"
    kotlin("plugin.spring") version "1.3.72"
    kotlin("plugin.jpa") version "1.3.72"
}



group = "com.darefriends"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
    mavenCentral()
    maven { url = uri("https://repo.spring.io/milestone") }
}

idea{
    module{
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/kotlin/main")
    }
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-jooq")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.liquibase:liquibase-core")
    implementation("mysql:mysql-connector-java")
    implementation("io.springfox:springfox-swagger2:2.9.2")
    implementation("io.springfox:springfox-swagger-ui:2.9.2")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    }
}


tasks.withType<Test> {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}

我不知道是什么问题。我正在使用 Kotlin 作为我的开发语言

请任何人帮我解决这个问题。在此先感谢..

【问题讨论】:

    标签: java spring-boot kotlin gradlew gradle-kotlin-dsl


    【解决方案1】:

    我使用您的确切配置创建了一个快速准系统项目,并且我注意到每当使用以下依赖行时总是存在构建问题;

    developmentOnly("org.springframework.boot:spring-boot-devtools")
    

    一点背景:

    Spring Boot 2.3.0.RC1 之前 - 或者至少据我所知,在版本 2.2.7.RELEASE 之前 - 有使用 developmentOnly 依赖标签引起的问题。解决方法是在包含依赖项之前在您的build.gradle 文件中定义developmentOnly,如下所示;

    val developmentOnly = configurations.create("developmentOnly")
    configurations.runtimeClasspath.get().extendsFrom(developmentOnly)
    

    但是,对于 Spring Boot 2.3.0.RC1(这是您正在使用的版本),引入了一个修复程序来自动处理定义 developmentOnly 配置。见:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3.0-RC1-Release-Notes#automatic-creation-of-developmentonly-configuration

    现在这个修复带来了另一个复杂性 - 用于排除 devtoolsdevelopmentOnly 配置从生成的胖 jar 中排除了一些 jar 文件(这也是您的可执行 jar)。见:https://github.com/spring-projects/spring-boot/issues/21288

    可能的解决方案:

    为了解决这个问题并继续前进,我有两个主要建议


    Option-1 -(使用 Spring Boot 2.3.0.RC1) - 完全摆脱这一行;

        developmentOnly("org.springframework.boot:spring-boot-devtools")
    

    如果你真的想控制在你的项目中何时以及如何使用 devtools,我的建议是遵循 Spring boot 官方文档https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/html/#packaging-executable-configuring-excluding-devtools 中的说明,该说明如下;

    默认情况下,Spring Boot 的 Devtools 模块, org.springframework.boot:spring-boot-devtools,将被排除在外 一个可执行的 jar 或战争。如果你想在你的 存档将 excludeDevtools 属性设置为 false:

    在科特林中:

    // if generating a jar file
    tasks.getByName<BootJar>("bootJar") {
        isExcludeDevtools = false
    }
    
    // if generating a war file
    tasks.getByName<BootWar>("bootWar") {
        isExcludeDevtools = false
    }
    

    显然,您可以随意切换此属性。


    Option-2 - 保留以下行

        developmentOnly("org.springframework.boot:spring-boot-devtools")
    

    但是将您的 Spring Boot 版本降级到最新的发布版本 - 目前,我认为这可能是 Spring Boot 2.2.7.RELEASE 然后使用流行的解决方法通过在 dependencies{...} 块之前的任何位置包含以下 developmentOnly 定义。

    val developmentOnly = configurations.create("developmentOnly")
    configurations.runtimeClasspath.get().extendsFrom(developmentOnly)
    

    【讨论】:

    • 非常感谢您的及时帮助,它工作正常。非常感谢朋友。
    • @sridharlovevirus,不客气。您决定使用哪些选项?
    • 第一个@technowcrat
    猜你喜欢
    • 2020-01-09
    • 2021-01-14
    • 1970-01-01
    • 2019-04-30
    • 2020-03-05
    • 2019-08-03
    • 2017-09-30
    • 2020-06-27
    • 2017-10-27
    相关资源
    最近更新 更多