错误 [找不到或无法加载主类]排查流程

classpath

1
2
echo $JAVA_HOME
echo $CLASSPATH

结果均为空,将 CLASSPATH 初始化为.后报错不变

maven 配置

maven package 出的 jar 包,想要直接 java -jar 运行的话需要在 MANIFEST.MF 中指定需要运行 main 的类 Main-Class

maven 需要使用maven-jar-plugin配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>org.me.sip.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>

其他

以上均无误后还是报错,在服务器上尝试解压jar包直接运行

jar包本质是修改了后缀名的zip包,所以可以直接用 unzip 解压,尝试后依然不行

检查代码,期望调用的类是其他类的子类,形如

1
2
3
4
5
6
7
8
9
public class Main extends SimpleChannelInboundHandler<SipMessageEvent> {

public static void main(String[] args) {
System.out.println("niconiconi");
}

@Override
protected void channelRead0(ChannelHandlerContext ctx, SipMessageEvent event) {}
}

将继承关系删掉后即可以正常执行

将两个版本的代码编译后的字节码进行反编译 javap -c -l -v xx 得到的信息来看 main 函数签名也没有区别

java8的jvm规范只说

The Java Virtual Machine then links the initial class, initializes it, and invokes the public class method void main(String[])

没有具体规定 main 函数的签名要求(也没有提 main 所在类的要求),因此具体报错原因依然未知