我第一次嘗試使用 Kotlin、Gradle 創建 Spring Boot 應用程式并在 heroku 上運行它。使用 Spring Initializr 在 IntelliK Idea 2022.1(終極版)中創建的專案當應用程式在 localhost 上由 ide 運行時,一切正常,但是當我嘗試從 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()
}
uj5u.com熱心網友回復:
您使用錯誤的 JAR 部署到 Heroku。應用 Spring Boot Gradle 插件時會創建 (2) 個 JAR。
- 由 Java 插件和Spring Boot Gradle 插件配置的分類器創建的普通JAR
plain - 由 Spring Boot Gradle 插件創建的uber JAR 或“胖”JAR
uber JAR 是一個可執行的 JAR,是您應該部署到 Heroku 的。
有關更多詳細資訊,請參閱檔案:https ://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/463593.html
