gradle Spring Application的构建文件无法通过java.lang.NoClassDefFoundError执行

3b6akqbq  于 2023-10-19  发布在  Spring
关注(0)|答案(1)|浏览(96)

发生了什么,我想做什么

我用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"
    }

}
j2qf4p5b

j2qf4p5b1#

检查你的spring Boot project build gradle配置文件,如果你有这样的东西:

application {
   mainClass.set("MainKt")
}

删除它并重新生成项目

相关问题