首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle Docker构建问题

Gradle Docker构建问题
EN

Stack Overflow用户
提问于 2021-10-13 16:15:48
回答 1查看 352关注 0票数 0

我有一个Dockerfile,包含以下内容:

代码语言:javascript
复制
FROM gradle:6.9.1-jdk17 as builder
COPY services/api/build.gradle.kts ./
COPY services/api/src ./
COPY services/api/settings.gradle.kts ./
RUN gradle build --no-daemon

FROM openjdk:8-jre-slim
COPY --from=builder /home/* /home
ENTRYPOINT [ "java", "-jar", "./home/build/libs/api.jar" ]

当我使用COPY --from=builder /home/* /home从builder复制时,它没有任何问题,如果我用sh进入图像,我可以看到home文件夹中有一个文件夹结构,包括build/libs/api.jar。然而,我只想复制JAR文件,所以我想运行COPY --from=builder /home/build/libs/api.jar .,它应该允许我简单地调用ENTRYPOINT [ "java", "-jar", "./api.jar" ],而不是完全限定的ENTRYPOINT [ "java", "-jar", "./home/build/libs/api.jar" ]

其次,当我尝试运行镜像时,容器显示为Error: Could not find or load main class com.library.api.MainKt。因此,我尝试使用我在dockerfile中运行的gradle build --no-daemon命令在本地构建api.jar文件,并减少dockerfile的内容,以简单地从本地构建文件夹复制该文件(完全省略gradle构建),并且可以完美地运行它。

在这个问题上,我简直要抓狂了。我的直觉告诉我gradle在dockerfile中构建jar的方式与在我的机器上不同,但版本是相同的,我正在努力寻找还有什么不同之处。

作为参考,我的build.gradle.kts内容如下:

代码语言:javascript
复制
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.4.31"
    kotlin("plugin.serialization") version "1.4.31"
}

group "com.cabanta"

repositories {
    mavenCentral()
}

dependencies {
  ...
}

tasks.withType<KotlinCompile>() {
    kotlinOptions.jvmTarget = "15"
}

tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.library.api.MainKt"
    }
    exclude("META-INF/*.RSA", "META-INF/*.SF", "META-INF/*.DSA")

    // To add all of the dependencies otherwise a "NoClassDefFoundError" error
    from(sourceSets.main.get().output)

    dependsOn(configurations.runtimeClasspath)
    from({
        configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
    })
}

如果你还需要任何东西来回答,请让我知道。

提前感谢你们这些优秀的人所能给予的任何帮助。

最后一条相关信息可能是我的主类没有类,它只有一个main()作为函数(在Kotlin中应该是允许的,正如我所说的,当在本地机器上运行gradle时,它构建并工作)

EN

回答 1

Stack Overflow用户

发布于 2021-10-14 10:00:29

问题原来是我将文件从本地复制到gradle步骤的方式。

代码语言:javascript
复制
COPY services/api/build.gradle.kts ./
COPY services/api/src ./
COPY services/api/settings.gradle.kts ./

现在,我已经更改为COPY services/api/* ./,它会复制所需的所有构建文件。

之前的API正在创建,但是它是在没有任何内容的情况下创建的,这意味着Java无法找到这个类……因为它从一开始就不存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69558908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档