天行健,君子以自強不息;地勢坤,君子以厚德載物。
每個人都有惰性,但不斷學習是好好生活的根本,共勉!
文章均為學習整理筆記,分享記錄為主,如有錯誤請指正,共同學習進步。
文章目錄
- 1. 場景
- 2. 報錯
- 3. 分析
- 4. 解決
- 4.2 配置manifest文件
- 4.2 配置指定main class
嘗試此篇之前請先看另一篇(推薦):no main manifest attribute, in app.jar
1. 場景
K8S部署Java項目 pod報錯
2. 報錯
使用log命令查看日志報錯如下
kubectl logs podname -n ns-sb
no main manifest attribute, in app.jar
截圖
3. 分析
報錯表示在app.jar
中無法找到主類,也就是說在app.jar中無法識別main方法程序入口
拓展兩個詞,manifest
文件和main class
:
manifest
文件是一個文本文件,用來描述jar包的元信息、版本信息、作者信息等,manifest文件通常放在jar包的META-INF
文件夾下,命名為MANIFEST.MF
main class
是一個Java程序的入口,在執行Java程序是會先找到這個類,執行類中的main方法,在jar包中如果沒有配置mainfest文件則需要在執行時指定main class
,否則無法執行
no main manifest attribute, in app.jar
表示既沒有配置manifest文件也沒有指定main class,接下來我們配置一下即可
4. 解決
4.2 配置manifest文件
在jar包中的META-INF
文件夾(沒有就創建一個)中創建MANIFEST.MF
文件
并在文件中定義內容如下:
Manifest-Version: 1.0 Main-Class: com.gitlab_runner.Application
com.gitlab_runner.Application
是main方法所在的類Application的包路徑,根據自己的定義
4.2 配置指定main class
在執行jar包命令程序中添加參數指定main class
路徑
在Dockerfile的Java執行程序命令中添加指定主類配置
java -cp app.jar com.gitlab_runner.Application
-cp
表示classpath
,就是app.jar的main class路徑
Dockerfile文件內容為
#關鍵字和值之間可以是空格" "也可以是等號"="
#指定基礎鏡像,以此鏡像為基礎構建
FROM openjdk:8-jdk-alpine#作者
MAINTAINER hs#設置環境變量
#JAVA_HOME環境變量定義,即配置jdk安裝目錄路徑,需是jdk文件全路徑名
ENV JAVA_HOME=/usr/local/java/jdk1.8.0.121
#MAVEN環境變量定義,即maven安裝的位置,需是maven全路徑名
ENV MAVEN_HOME=/usr/share/maven
#配置環境變量
ENV PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
#指定容器的時區
ENV TZ=Asia/Shanghai#復制文件到鏡像中,將本地文件或目錄復制到鏡像指定位置,該操作也在.gitlab-ci.yml文件中腳本進行執行了
COPY app.jar app.jar#時區配置,可省略
#RUN ln -snf /usr/share/zonginfo/$TZ /etc/localtime && echo $TZ > /etc/timezone#容器入口,該命令應該是將每個字符串組合起來,nohub java -jar app.jar
ENTRYPOINT ["nohup","java","-jar","-cp","app.jar","com.gitlab_runner.Application"]#聲明要監聽的端口(暴露端口,容器內部的端口,這里暫時不用)
EXPOSE 8089
那么我們是maven項目,maven項目配置指定識別的插件即可,在pom中配置插件
感謝閱讀,祝君暴富!