I have a university project which consist of building a Java Spring Boot application that can handle multiple APIs that can start new docker containers running jar applications.
For the moment, I was able to experiment how Spring Boot works, so I built a simple jar to deploy a simple greeting API that returns “Hello World!”
So I have built and pushed a docker image using jib-core to my DockerHub repo which work fine.
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")));
}
The problem is, when I execute the following command docker run -i -t dmh911/localkube:latest
, I get in return this error:
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
This is the jar MANIFEST file:
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
I know that the problem is probably something very silly, but I don’t know what exactly.
Advertisement
Answer
What you’re code will execute is java demo-0.0.1-SNAPSHOT.jar
, which will try to run the class demo-0.0.1-SNAPSHOT.jar
, which is unlikely to exist because this is probably the name of your jar file, and not the class you want to run.
Instead your entrypoint should be java -jar demo-0.0.1-SNAPSHOT.jar
, which means you need to change your code to .setEntrypoint("java", "-jar", "demo-0.0.1-SNAPSHOT.jar")
.