spring - Dockerfile 无法构建 jar 文件 : Main class name has not been configured

标签 spring docker kotlin gradle dockerfile

我正在为微服务架构(spring)构建一个 dockerfile,但我发现一些困难。 我在构建启动 jar 时遇到此错误

Main class name has not been configured and it could not be resolved

我的dockerfile是

FROM gradle:6.5-jdk11 AS TEMP_BUILD_IMAGE
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME
COPY build.gradle.kts settings.gradle.kts $APP_HOME

COPY gradle $APP_HOME/gradle
COPY --chown=gradle:gradle . /home/gradle/src
USER root
RUN chown -R gradle /home/gradle/src

RUN gradle bootJar || return 0
COPY . .
RUN gradle clean bootJar 

FROM openjdk:11-jdk
ENV ARTIFACT_NAME=app.jar
ENV APP_HOME=/usr/app/

WORKDIR $APP_HOME
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/$ARTIFACT_NAME .

ENTRYPOINT exec java -jar ${ARTIFACT_NAME}

错误出现在第9步

RUN gradle bootJar || return 0

我尝试将类的名称放入 gradle 文件中,但出现此错误

Exception in thread "main" java.lang.NoSuchMethodException: com.test.config.ConfigServerApp.main([Ljava.lang.String;)

这是我的 gradle 文件

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.springframework.boot.gradle.tasks.bundling.BootJar

plugins {
    id("io.spring.dependency-management") version "1.0.9.RELEASE"
    id("org.springframework.boot") version "2.3.0.RELEASE"
    kotlin("plugin.spring") version "1.3.72"
    kotlin("jvm") version "1.3.72"
}

repositories {
    mavenCentral()
}

group = "com.test"
version = "1.0.0"
java.sourceCompatibility = JavaVersion.VERSION_11

extra["springCloudVersion"] = "Hoxton.SR5"

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    implementation("org.springframework.cloud:spring-cloud-config-server")
    implementation("org.springframework.cloud:spring-cloud-config-monitor")
    implementation("org.springframework.cloud:spring-cloud-starter-bus-amqp")

    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    }
}

dependencyManagement {
    imports {
        mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        jvmTarget = "1.8"
        freeCompilerArgs = listOf("-Xjsr305=strict")
    }
}

tasks.withType<BootJar> {
    archiveFileName.set("app.jar")
    mainClassName = "com.test.config.ConfigServerApp"
}

这是我的主类(我使用 kotlin)

package com.test.config

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.cloud.config.server.EnableConfigServer

@EnableConfigServer
@SpringBootApplication
class ConfigServerApp

fun main(args : Array<String>)
{
    runApplication<ConfigServerApp>(*args)
}

当我从编辑器启动应用程序时,它可以工作,但是当我从 jar 文件或 docker 启动它时,它不起作用

请问我该如何解决这个问题?

最佳答案

只是为了根据我的评论做出正式答复,因为它有效。正如我在评论中解释的:当我们使用 Kotlin 时,真正的主类是在幕后生成的,带有 Kt 后缀,运行 gradle bootJar 后,您应该在构建文件夹中找到它。

您应该将 mainClassName 更新为 com.test.config.ConfigServerAppKt,如下所示:

tasks.withType<BootJar> {
    archiveFileName.set("app.jar")
    mainClassName = "com.test.config.ConfigServerAppKt"
}

关于spring - Dockerfile 无法构建 jar 文件 : Main class name has not been configured,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62232537/

相关文章:

java - 在 Spring-Security 中,j_spring_security_logout 到底是什么?我听说它被称为 "handler"但我不确定那是什么意思

amazon-web-services - .ebextensions 在 elasticbeanstalk 上使用 Docker

docker - Docker撰写与mariaDB的链接

java - android-manifest 中的 android.stamp 是什么?

angularjs - session 超时 - Spring boot + Angular 应用程序中的 HTTP 状态代码 -1

java - 具有 JPA 持久性的 Spring 状态机 - 存储库使用

java - 按设定的重复间隔发送预定消息

docker - 如何在同一个docker-compose文件中将数据库从沙发床容器映射到另一个容器webapp

java - 如何获得 firebase token ?

android - 如何在 Kotlin 中实现 MediaPlayer onErrorListener