I am having a problem starting a .jar file within a Docker Container. The error message I am getting is:
Exception in thread “main” java.lang.ClassNotFoundException: ccinfw.MainApplication
I have added information below. Why am I getting this error and how can I fix it?
TIA
Manifest File
Manifest-Version: 1.0 Implementation-Title: SpringBootErrorHandlingDemoy Implementation-Version: 0.0.1-SNAPSHOT Archiver-Version: Plexus Archiver Built-By: root Implementation-Vendor-Id: ccinfw Spring-Boot-Version: 1.5.4.RELEASE Implementation-Vendor: Pivotal Software, Inc. Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: ccinfw.MainApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Created-By: Apache Maven 3.3.9 Build-Jdk: 1.8.0_131 Implementation-URL: http://maven.apache.org
ran jar -xvf BackEndRestFunctionality-0.0.1-SNAPSHOT.jar > expanded. Below is a portion of the output. MainApplication.class does exist in the jar file
[... snip ...] inflated: BOOT-INF/classes/ccinfw/security/user/ApplicationUser.class inflated: BOOT-INF/classes/ccinfw/security/security/SecurityConstants.class inflated: BOOT-INF/classes/ccinfw/security/security/AccountCredentials.class inflated: BOOT-INF/classes/ccinfw/security/security/WebSecurity.class inflated: BOOT-INF/classes/ccinfw/security/security/JWTAuthenticationFilter.class inflated: BOOT-INF/classes/ccinfw/security/security/JWTAuthorizationFilter.class **inflated: BOOT-INF/classes/ccinfw/MainApplication.class** inflated: BOOT-INF/classes/ccinfw/dao/MstrgenroletypeDAO.class inflated: BOOT-INF/classes/application.properties created: META-INF/maven/ created: META-INF/maven/ccinfw/ created: META-INF/maven/ccinfw/BackEndRestFunctionality/ inflated: META-INF/maven/ccinfw/BackEndRestFunctionality/pom.xml inflated: META-INF/maven/ccinfw/BackEndRestFunctionality/pom.properties created: BOOT-INF/lib/ extracted: BOOT-INF/lib/slf4j-api-1.7.25.jar [... snip ...]
I am using the following software
jenkins-slave-one:/var/jenkins/workspace/build-cc-restapi-dev/target/docker# java -version openjdk version "1.8.0_131" OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11) OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode) jenkins-slave-one:/var/jenkins/workspace/build-cc-restapi-dev/target/docker# javac -version javac 1.8.0_131 jenkins-slave-one:/var/jenkins/workspace/build-cc-restapi-dev/target/docker# mvn -version Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00) Maven home: /opt/maven Java version: 1.8.0_131, vendor: Oracle Corporation Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "4.4.0-87-generic", arch: "amd64", family: "unix"
Maven Dependencies
I am getting the following error message when starting it:
Exception in thread "main" java.lang.ClassNotFoundException: ccinfw.MainApplication at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
the maven command executed within Jenkins
$ /opt/maven/bin/mvn -f /var/jenkins/workspace/build-cc-restapi-dev/pom.xml -Pdevelopment clean package docker:build -B
portion of pom.xml file responsible for building
<profile> <id>development</id> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <copy file="${project.build.outputDirectory}/application.development.properties" tofile="${project.build.outputDirectory}/application.properties" /> </tasks> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <configuration> <imageName>apostx-cc-restapi-dev</imageName> <baseImage>java:8</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <!-- copy the service's jar file from target into the root directory of the image --> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <plugin> <!-- Build an executable JAR --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <!-- <version>2.6</version> --> <executions> <execution> <id>analyze</id> <phase>package</phase> <configuration> <failBuild>true</failBuild> <ignoreDirect>false</ignoreDirect> </configuration> </execution> </executions> <configuration> <archive> <manifest> <mainClass>ccinfw.MainApplication</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </profile>
the Dockerfile being accessed
FROM java:8 ADD /BackEndRestFunctionality-0.0.1-SNAPSHOT.jar // ENTRYPOINT ["java", "-jar", "/BackEndRestFunctionality-0.0.1-SNAPSHOT.jar"] ~
Here is a part of the Jenkins log file where the Docker Image file is being built using the generated .jar file – again – the .jar file works fine when ran on its own
[INFO] Copying /var/jenkins/workspace/build-cc-restapi-dev/target/BackEndRestFunctionality-0.0.1-SNAPSHOT.jar -> /var/jenkins/workspace/build-cc-restapi-dev/target/docker/BackEndRestFunctionality-0.0.1-SNAPSHOT.jar [INFO] Building image apostx-cc-restapi-dev Step 1/3 : FROM java:8 ---> d23bdf5b1b1b Step 2/3 : ADD /BackEndRestFunctionality-0.0.1-SNAPSHOT.jar // ---> abfcb05b4173 Removing intermediate container f573f737009a Step 3/3 : ENTRYPOINT java -jar /BackEndRestFunctionality-0.0.1-SNAPSHOT.jar ---> Running in 28bb20467e70 ---> 2ffb803f96dc Removing intermediate container 28bb20467e70 ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null} Successfully built 2ffb803f96dc Successfully tagged apostx-cc-restapi-dev:latest [INFO] Built apostx-cc-restapi-dev [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 30.181 s [INFO] Finished at: 2018-01-30T06:18:18+00:00 [INFO] Final Memory: 36M/95M [INFO] ------------------------------------------------------------------------
Docker Image Layers
351.5 MB RUN set -x && apt-get update && apt-get install -y openjdk-8-jdk="$JAVA_DEBIAN_VERSION" ca-certificates-java="$CA_CERTIFICATES_JAVA_VERSION" && rm -rf /var/lib/apt/lists/* && [ "$JAVA_HOME" = "$(docker-java-home)" ] 123 MB ADD file:89ecb642d662ee7edbb868340551106d51336c7e589fdaca4111725ec64da957 in / 122.6 MB RUN apt-get update && apt-get install -y --no-install-recommends bzr git mercurial openssh-client subversion procps && rm -rf /var/lib/apt/lists/* 44.3 MB RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl wget && rm -rf /var/lib/apt/lists/* 32.9 MB ADD file:565dae161b3b516b50d596648650278591d96fe820e36a3eeef0ee7c33d7915d in // 1.3 MB RUN apt-get update && apt-get install -y --no-install-recommends bzip2 unzip xz-utils && rm -rf /var/lib/apt/lists/* 418.5 kB RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure 87 B RUN { echo '#!/bin/sh'; echo 'set -e'; echo; echo 'dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"'; } > /usr/local/bin/docker-java-home && chmod +x /usr/local/bin/docker-java-home 55 B RUN echo 'deb http://deb.debian.org/debian jessie-backports main' > /etc/apt/sources.list.d/jessie-backports.list 0 B CMD ["/bin/bash"] 0 B ENV LANG=C.UTF-8 0 B ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 0 B ENV JAVA_VERSION=8u111 0 B ENV JAVA_DEBIAN_VERSION=8u111-b14-2~bpo8+1 0 B ENV CA_CERTIFICATES_JAVA_VERSION=20140324 0 B ENTRYPOINT ["java" "-jar" "/BackEndRestFunctionality-0.0.1-SNAPSHOT.jar"]
Advertisement
Answer
I found out what the problem was – thank goodness for having a version in Gitlab to refer to (as well as a “previous” version on another machine)
Basically, I used Maven to put the project together. I executed the following command from Jenkins to build the .jar file
$ /opt/maven/bin/mvn -f /var/jenkins/workspace/build-cc-restapi-dev/pom.xml -Pdevelopment clean package docker:build -B
In the pom.xml file, I did not specify :
<artifactId></artifactId>
When I went ahead and set it
ex: <artifactId>stuff</artifactId>
Docker started the jar file correctly and everything worked fine.