问题描述
我有一个大学项目,其中包括构建一个Java Spring Boot应用程序,该应用程序可以处理多个API,这些API可以启动运行jar应用程序的新docker容器。
目前,我能够试验Spring Boot的工作原理,因此我构建了一个简单的jar来部署一个简单的问候API,该API返回“ Hello World!”。
所以我已经使用臂架构建并推送了一个Docker镜像并将其推送到我的dockerhub存储库中,效果很好。
public static void main(String[] args) throws InvalidImageReferenceException,IOException,InterruptedException,ExecutionException,RegistryException,CacheDirectoryCreationException {
jib.from("openjdk:15")
.addLayer(Arrays.asList(Paths.get("apps/demo-0.0.1-SNAPSHOT.jar")),AbsoluteUnixPath.get("/"))
.setEntrypoint("java","demo-0.0.1-SNAPSHOT.jar")
.containerize(
Containerizer.to(RegistryImage.named("dmh911/localkube:latest")
.addCredential("username","password")));
}
问题是,当我执行以下命令docker run -i -t dmh911/localkube:latest
时,我得到此错误的回报:
Error: Could not find or load main class demo-0.0.1-SNAPSHOT.jar
Caused by: java.lang.classNotFoundException: demo-0.0.1-SNAPSHOT.jar
这是jar清单文件:
Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Build-Jdk-Spec: 15
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.restservice.DemoApplication
Spring-Boot-Version: 2.3.4.RELEASE
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
我知道问题可能很愚蠢,但我不知道到底是什么。
解决方法
您要执行的代码是java demo-0.0.1-SNAPSHOT.jar
,它将尝试运行类demo-0.0.1-SNAPSHOT.jar
,该类不太可能存在,因为这可能是您的jar文件的名称,而不是类的名称你想跑步。
您的入口点应该是java -jar demo-0.0.1-SNAPSHOT.jar
,这意味着您需要将代码更改为.setEntrypoint("java","-jar","demo-0.0.1-SNAPSHOT.jar")
。