[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 推荐文献

X 参考文献

posted @ 2023-04-13 01:12  千千寰宇  阅读(924)  评论(0编辑  收藏  举报