我第一次尝试用Kotlin,Gradle创建Spring Boot应用程序,并在heroku上运行。使用Spring Initializr在IntelliK Idea 2022.1(最终版)中创建的项目当应用程序在本地主机上运行时,一切都很好,但是当我尝试从jar文件运行应用程序时,会出现一些问题。
第一个问题:
no main manifest attribute, in build/libs/app-0.0.1-plain.jar
所以我添加了build.gradle.kts
tasks.jar {
manifest {
attributes["Main-Class"] = "com.example.package.ApplicationKt"
}
}
第二个问题:
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
为了解决这个问题,我在tasks.jar中添加了
from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
下一个:
Entry META-INF/LICENSE.txt is a duplicate but no duplicate handling strategy has been set
我的解决方案:
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
最后是老板:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourceHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instanti
ation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'resourceHandlerMapping' threw exception; nested exception is java.lang.
IllegalStateException: No ServletContext set
我不知道如何解决这个问题,我试着替换
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-webflux")
但它没有工作。在控制台,我看到有很多负面匹配,其中之一:
@ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)
我也试过在java 11上运行它,但结果相同。有人知道我该怎么做吗?
运行应用程序,我使用:
java -jar build/libs/app-0.0.1-plain.jar --server.port=8080
最后的build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.6.7"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.6.21"
kotlin("plugin.spring") version "1.6.21"
}
group = "com.example"
version = "0.0.1"
java.sourceCompatibility = JavaVersion.VERSION_1_8
repositories {
mavenCentral()
}
tasks.jar {
manifest {
attributes["Main-Class"] = "com.example.package.ApplicationKt"
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
// To add all of the dependencies
from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
}
dependencies {
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")
runtimeOnly("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
您使用了错误的JAR来部署到Heroku。当Spring Boot Gradle插件被应用时,有(2)个jar被创建。
- 一个plainJAR,由Java插件创建,并由Spring Boot Gradle插件 配置
- AuberJAR或"fat"由Spring Boot Gradle插件 创建的JAR
plain
分类器。优步JAR是一个可执行的JAR,是你应该部署到Heroku的。
查看文档获取更多详细信息:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable