[Java EE] SpringBoot/Tomcat之启动时报"Error: Could not find or load main class CLASS xxxx"、"no main manifest attribute"异常
环境信息如下:
- OS: CENTOS 7
- Tomcat : 9.0.46
- SpringBoot: 2.3.12.RELASE
- Build JDK: 1.8.0_261
- Runetime JDK : openjdk 1.8.0_362
1 “Error: Could not find or load main class CLASS xxxx” 异常的排查步骤
Step1 确保JDK/JRE及相关环境变量配置有效
配置 Java 环境变量的步骤:
> vi /etc/profile
JAVA_HOME=/usr/local/java/jdk1.8.0_231
JRE_HOME=/usr/java/jdk1.8.0_151/jre
# CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
> source /etc/profie
2 "no main manifest attribute"异常的排查步骤
问题现象
使用命令启动应用程序
nohup java -jar xxx.jar &
或java -cp xxx.jar cn.xx.XXBizApplication
时,报"no main manifest attribute
"错误
问题分析
no main manifest attribute
即:找不到主类
首先需考虑:
- 是不是类路径存在配置错误或发生变化,自己没有及时修正;
[情况1] 若启动方式为
nohup bin/bootstrap >> logs/console.log 2>&1 &
方式启动时,重点排查:
- 检查
bootstrap
脚本中的CLASSPATH
是否包含全了 所需的 LIB 包,且包名是否正确?- 检查
CLASS-Path
对应的JAR包
是否存在、且包名一一对应无偏差?- 检查
bootstrap
脚本中的启动类的类路径是否遗漏、正确?
bootstrap
脚本一般在pom.xml中配置完成后,由maven打包插件org.codehaus.mojo:appassembler-maven-plugin
自动生成
[情况2] 若启动方式为
nohup java -jar xxx.jar &
或java -cp xxx.jar cn.xx.XXBizApplication
方式启动时,重点排查:查看 目标 JAR 包的
META-INF/MANIFEST.MF
、或BOOT-INF/MANIFEST.MF
中 :
一般情况下,java 打包成 jar 包需要在 MANIFEST.MF 中指定 Main-Class 项,以便运行 java -jar xxx.jar 时找到对应的主类。
因为-jar的含义就是后面跟的jar包是有main class可独立运行,所以需要在打包成jar包时指定这个类;否则,需要在执行的时候手动指定。
- 检查
Class-Path
是否包含全了 所需的 LIB 包,且包名是否正确?- 检查
CLASS-Path
对应的JAR包
是否存在、且包名一一对应无偏差?- 检查
Main-Class(启动类)
是否遗漏、正确?
解决方法
对症下药,切忌不经思考就采取如下手段!
情况1:启动手动指定引导启动类
- 在运行jar包时,使用
-cp
/--classpath
来手动指定
java -cp xxx.jar {cn.yy.xxx.引导启动类名}
情况2:打包时,pom.xml的打包插件中配置Main-Class
- 方法1:打包插件
org.springframework.boot:spring-boot-maven-plugin
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
<mainClass>cn.api.ProviderApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
- 方法2:打包插件
org.springframework.boot:spring-boot-maven-plugin
3 java
/ jar
命令
3.1 解压JAR包
- 方法1 解压到当前目录
注意: 不会创建一个 game 文件夹,而是将所有jar包的内容全部解压到当前文件夹
jar -xvf project.jar
- 方法2 tar
tar -xvf xx.jar
# TAR 解压: 解压压缩文件到指定目录
tar -xvf <dirName/compressedFile>.jar -C <targetDir>
tar -xvf <dirName/compressedFile>.tar.gz -C <targetDir>
3.2 指定目录下的文件打成JAR包
- 把指定目录下的所有文件打包成JAR包
jar -cvfM0 project.jar ./
-
-c
创建jar包 -
-v
显示过程信息 -
-f
-
-M
-
-0
阿拉伯数字,只打包不压缩之意 -
将当前目录下的所有文件打包,并放至上一级目录下
jar -cf ../xx.jar ./*
3.3 查看 jar 包的内容
使用 t 选项可以查看 test.jar 中的内容
[root@linux ~]# jar tvf test.jar # 在 test.jar
3 unzip
命令
unzip
命令用于解压缩由zip
命令压缩的“.zip
”压缩包,也可用来解压jar包
详情参见:
CASE1 解压zip包到指定目录下
unzip -o xxx.zip -d tmp/
Y 推荐文献
- [Linux]常用命令之【tar/zip/unzip/gzip/gunzip】 - 博客园/千千寰宇 【推荐】
- 打包运行报no main manifest attribute, in XXXX的解决办法 - 博客园 【推荐】
- JDK 命令之 jar -- 压缩/解压缩工具 - CSDN 【推荐】
- jar -cf 命令 - CSDN
- java -jar命令详解 - CSDN 【推荐】
X 参考文献
- Error: Could not find or load main class CLASS的解决方法 - CSDN 【推荐】
- 由于“输入行太长”而在Windows上运行.bat文件时出 - ORcode
- maven:用appassembler-maven-plugin打包含有自定义目录的JAVA程序 - 博客园
- http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html 【推荐】
- 启动jar文件,报”no main manifest attribute“异常 - CSDN
- jar运行报错no main manifest attribute - CSDN 【不推荐】
- 使用unzip解压jar包和jar包的打包方法 - CSDN
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!