Kali Linux中Java运行异常:Jar文件抛出NoClassDefFoundError求助
解决Kali Linux中运行老版本Jar(如CobaltStrike)出现的java.lang.NoClassDefFoundError问题
我之前在Kali上折腾CobaltStrike 3.8版本的时候,完完全全碰到过一模一样的报错!这个问题的根源其实很好定位:
Exception in thread "main" java.lang.NoClassDefFoundError: sun/swing/plaf/synth/SynthIcon
为什么会出现这个错误?
sun/swing/plaf/synth/SynthIcon是Oracle JDK私有API里的类,而Kali Linux默认预装的是OpenJDK,而且版本普遍是Java 11及以上。从Java 9开始,Oracle官方就把这些以sun.*开头的私有模块给移除并隐藏了——老版本的CobaltStrike(比如你提到的2.5、3.6、3.8)都是基于Java 8开发的,依赖这些私有类,自然就会抛出找不到类的异常。
具体解决方案
这里给你两个可行的办法,按需选择:
1. 全局切换到Java 8(推荐,一劳永逸)
老版本CS对Java 8的兼容性最好,不管是Oracle JDK还是OpenJDK 8都可以,这里以Oracle JDK 8为例:
- 先卸载当前系统里的高版本OpenJDK,避免冲突:
sudo apt remove --purge openjdk-* sudo apt autoremove - 下载对应架构的Oracle JDK 8安装包(比如amd64版本),解压到系统的JVM目录:
sudo tar zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/lib/jvm/ - 用
update-alternatives配置系统默认Java版本:sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_XXX/bin/java 100 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_XXX/bin/javac 100 - 验证配置是否成功:
输出显示java -versionjava version "1.8.0_XXX"就说明没问题了,之后直接运行CS的Jar包即可。
2. 临时指定Java版本运行(适合不想全局切换的场景)
如果你不想替换系统默认的Java版本,可以直接用Java 8的可执行文件路径来运行Jar:
/usr/lib/jvm/jdk1.8.0_XXX/bin/java -jar cobaltstrike.jar
这里的jdk1.8.0_XXX要替换成你实际解压的JDK目录名称。
补充说明
如果不想用Oracle JDK,也可以尝试安装OpenJDK 8,它同样包含这些sun.*的私有类,命令如下:
sudo apt install openjdk-8-jdk
安装完成后同样用update-alternatives切换版本即可,不过Oracle JDK对CS这类商业工具的兼容性可能会略好一点。
内容的提问来源于stack exchange,提问作者AxReal GS




