Docker 镜像中的 ClassNotFound org.mapstruct.factory.Mappers

问题描述 投票:0回答:3

我正在使用 Mapstruct(带有 lombok),当我在调用使用 MapStruct 将 DTO 映射到实体的端点后对应用程序进行 dockerize 时,Mapstruct 会失败。

引起:java.lang.ClassNotFoundException:org.mapstruct.factory.Mappers在java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435)在java.base/java.lang.ClassLoader.loadClass(ClassLoader) .java:589) 在 org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)

当我在本地运行应用程序时一切正常,但对应用程序进行 Docker 化会使 Mapstruct 失败。

Dockerfile:

FROM openjdk:15-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

build.gradle
中的依赖项和 docker 插件:


docker {
    dependsOn build as Task
    name "${project.group}/${jar.baseName}"
    files bootJar.archivePath
    buildArgs(['JAR_FILE': "${bootJar.archiveName}"])
}

dependencies {
    .....

    compileOnly 'org.mapstruct:mapstruct:1.4.1.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.1.Final'
}

有什么我遗漏的或者我需要额外做的事情才能在泊坞窗中拥有

Impl
类吗?

java docker mapstruct
3个回答
3
投票

我不太了解你是如何创建你的docker镜像的。但是,我认为问题在于您正在使用

compileOnly
作为
mapstruct
依赖项(
Mappers
工厂所在的位置)。

我认为不再鼓励使用

compileOnly
,而且无论如何它都不是
org.mapstruct:mapstruct
的正确选择。如果您为映射器使用默认组件模型并且想要使用
Mappers
工厂,那么
org.mapstruct:mapstruct
依赖项绝对不是
compileOnly
。您需要更改它才能使您的 docker 映像正常工作。


0
投票

我认为你需要构建具有依赖项的 jar。如果您使用 maven 构建它,只需在 pom.xml 中添加以下内容

<descriptorRef> jar-with-dependencies </descriptorRef>


0
投票

您只需更新您的

build.gradle
文件即可。将
implementation
而不是
compileOnly
作为映射结构依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.