天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
文章目录
- 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.jarENTRYPOINT ["nohup","java","-jar","-cp","app.jar","com.gitlab_runner.Application"]#声明要监听的端口(暴露端口,容器内部的端口,这里暂时不用)EXPOSE 8089
那么我们是maven项目,maven项目配置指定识别的插件即可,在pom中配置插件
感谢阅读,祝君暴富!