Spring 启动应用程序部署问题
Spring Boot Application Deployment Issue
朋友们好,
我是 spring 启动框架的新手。我已经完成了简单的 spring 引导应用程序,所以我要在我的服务器中部署 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 作为我的开发语言
任何人请帮我解决这个问题。提前致谢..
我使用您的确切配置创建了一个快速准系统项目,我注意到每当使用以下依赖行时总是存在构建问题;
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
现在,此修复带来了另一个复杂问题 - 用于排除 devtools
,developmentOnly
配置从生成的 fat jar 中排除了一些 jar 文件(您的可执行 jar 也是如此)。参见:https://github.com/spring-projects/spring-boot/issues/21288.
可能的解决方案:
为了解决这个问题并继续前进,我有两个主要建议
Option-1 - (With 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 中的说明状态如下;
By default, Spring Boot’s Devtools module,
org.springframework.boot:spring-boot-devtools
, will be excluded from
an executable jar or war. If you want to include Devtools in your
archive set the excludeDevtools property to 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 启动版本降级到最新版本 - 目前,我认为可能是 Spring Boot 2.2.7.RELEASE 然后通过在 dependencies{...}
块之前的任何位置包含 developmentOnly
的以下定义来使用流行的解决方法。
val developmentOnly = configurations.create("developmentOnly")
configurations.runtimeClasspath.get().extendsFrom(developmentOnly)
朋友们好,
我是 spring 启动框架的新手。我已经完成了简单的 spring 引导应用程序,所以我要在我的服务器中部署 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 作为我的开发语言
任何人请帮我解决这个问题。提前致谢..
我使用您的确切配置创建了一个快速准系统项目,我注意到每当使用以下依赖行时总是存在构建问题;
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
现在,此修复带来了另一个复杂问题 - 用于排除 devtools
,developmentOnly
配置从生成的 fat jar 中排除了一些 jar 文件(您的可执行 jar 也是如此)。参见:https://github.com/spring-projects/spring-boot/issues/21288.
可能的解决方案:
为了解决这个问题并继续前进,我有两个主要建议
Option-1 - (With 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 中的说明状态如下;
By default, Spring Boot’s Devtools module,
org.springframework.boot:spring-boot-devtools
, will be excluded from an executable jar or war. If you want to include Devtools in your archive set the excludeDevtools property to 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 启动版本降级到最新版本 - 目前,我认为可能是 Spring Boot 2.2.7.RELEASE 然后通过在 dependencies{...}
块之前的任何位置包含 developmentOnly
的以下定义来使用流行的解决方法。
val developmentOnly = configurations.create("developmentOnly")
configurations.runtimeClasspath.get().extendsFrom(developmentOnly)