Docker 图片中的 ClassNotFound org.mapstruct.factory.Mappers
ClassNotFound org.mapstruct.factory.Mappers in Docker Image
我正在使用 Mapstruct(与 lombok),当我在调用使用 MapStruct 将 DTO 映射到实体的端点后 docker 化应用程序时,Mapstruct 失败。
Caused by: java.lang.ClassNotFoundException: org.mapstruct.factory.Mappers at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
当我在本地 运行 应用程序时一切正常,但是 docker 调整应用程序会使 Mapstruct 失败。
Docker 文件:
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'
}
我是否遗漏了什么或者我需要额外做些什么才能在 docker 中包含 Impl
类?
我认为您需要构建具有依赖项的 jar。如果您使用 Maven 构建它,只需在 pom.xml
中添加以下内容
<descriptorRef> jar-with-dependencies </descriptorRef>
我不太了解您是如何创建 docker 图像的。但是,我认为问题在于您正在使用 compileOnly
作为 mapstruct
依赖项(Mappers
工厂所在的位置)。
我认为 compileOnly
不再被鼓励使用,而且它对 org.mapstruct:mapstruct
来说从来都不是正确的。如果您正在为您的映射器使用默认组件模型并且您想要使用 Mappers
工厂,那么 org.mapstruct:mapstruct
依赖项绝对不是 compileOnly
。您需要更改它才能使 docker 图片正常工作。
我正在使用 Mapstruct(与 lombok),当我在调用使用 MapStruct 将 DTO 映射到实体的端点后 docker 化应用程序时,Mapstruct 失败。
Caused by: java.lang.ClassNotFoundException: org.mapstruct.factory.Mappers at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
当我在本地 运行 应用程序时一切正常,但是 docker 调整应用程序会使 Mapstruct 失败。
Docker 文件:
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'
}
我是否遗漏了什么或者我需要额外做些什么才能在 docker 中包含 Impl
类?
我认为您需要构建具有依赖项的 jar。如果您使用 Maven 构建它,只需在 pom.xml
中添加以下内容<descriptorRef> jar-with-dependencies </descriptorRef>
我不太了解您是如何创建 docker 图像的。但是,我认为问题在于您正在使用 compileOnly
作为 mapstruct
依赖项(Mappers
工厂所在的位置)。
我认为 compileOnly
不再被鼓励使用,而且它对 org.mapstruct:mapstruct
来说从来都不是正确的。如果您正在为您的映射器使用默认组件模型并且您想要使用 Mappers
工厂,那么 org.mapstruct:mapstruct
依赖项绝对不是 compileOnly
。您需要更改它才能使 docker 图片正常工作。