发生了什么,我想做什么
我用spring initializr(https://start.spring.io/)做了一个Springboot项目。
但是我不能执行这个错误的jar文件。
java -jar build/libs/spring302-0.0.1-SNAPSHOT-plain.jar
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at com.kaede.spring302.Spring302ApplicationKt.main(Spring302Application.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 1 more
我该怎么办?
我想这样做,因为我需要构建到Docker容器。
我是怎么做这个项目的
我选择
- Kotlin
- Gradle 7.2
- Spring 3.0.2
- Java 17
我使用IntelliJ来构建。
Project Name is spring302 Name Space is com.kaede
1.尝试添加Manifest主类
java -jar build/libs/kotlin1-0.0.1-SNAPSHOT-plain.jar
Error: Could not find or load main class
首先,我试图只是建立,然后发生了这个错误。
tasks.withType<Jar> {
manifest {
attributes["Main-Class"] = "com.kaede.spring302.Spring302Application"
}
}
所以我在spring 302/build.gradle.kts中添加了Manifest Main-Class
java -jar build/libs/spring302-0.0.1-SNAPSHOT-plain.jar
Error: Main method not found in class com.kaede.spring302.Spring302Application,
please define the main method as:
public static void main(String[] args)
这不是Java的Main方法错误。
2.将Main-Class改为classNameKt
我将Main-Class从Spring 302 Application更改为Spring 302 ApplicationKt
我听说Kotlin类将更改classNameKt.java。
tasks.withType<Jar> {
manifest {
attributes["Main-Class"] = "com.kaede.spring302.Spring302ApplicationKt"
}
}
所以我改变了我的主要课程。
java -jar build/libs/spring302-0.0.1-SNAPSHOT-plain.jar
Exception in thread "main" java.lang.NoClassDefFoundError:
kotlin/jvm/internal/Intrinsics
at com.kaede.spring302.Spring302ApplicationKt.main(Spring302Application.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 1 more
然后我在Spring302ApplicationKt.main中得到了NoClassDefFoundError。
javap spring302-0.0.1-SNAPSHOT-plain/com/kaede/spring302/Spring302ApplicationKt.class
Compiled from "Spring302Application.kt"
public final class com.kaede.spring302.Spring302ApplicationKt {
public static final void main(java.lang.String[]);
}
我的输出也有main。
3.移除.m2/repository并重建
rm -rf ~/.m2/repository
我认为依赖关系是复杂的,所以我删除所有和重新构建.
但事情并没有改变。
What I Expect
我可以执行jar文件
4.将Main方法从runApplication改为SpringApplication.run
主
runApplication<Spring302Application>(*args)
到
SpringApplication.run(Spring302Application::class.java, *args
但是NoClassDefFoundError不会改变
build.gradle.kts
这是我的全部依赖。
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "3.0.2"
id("io.spring.dependency-management") version "1.1.0"
kotlin("jvm") version "1.7.22"
kotlin("plugin.spring") version "1.7.22"
}
group = "com.kaede"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17
repositories {
mavenCentral()
}
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")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "17"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
tasks.withType<Jar> {
manifest {
attributes["Main-Class"] = "com.kaede.spring302.Spring302ApplicationKt"
}
}
1条答案
按热度按时间j2qf4p5b1#
检查你的spring Boot project build gradle配置文件,如果你有这样的东西:
删除它并重新生成项目