命令行运行Jar包触发IllegalAccessException,Eclipse无错如何排查?
排查步骤
- 检查类的访问权限:确认
main.FirefoxServer类本身是public修饰的。如果类是默认包访问权限(未加public),即便方法是public static,反射跨类加载器访问时也会触发权限异常——Eclipse运行时的类加载环境和Jar包的JarRsrcLoader加载环境存在差异,默认权限在Eclipse中可能可访问,但Jar包运行时会被限制。 - 核对main方法签名:确保你的main方法是标准格式:
public static void main(String[] args)。参数类型必须是String[],返回值必须是void,修饰符严格为public static。JarRsrcLoader通过反射查找标准main方法,签名不符会导致反射时权限判断异常。 - 检查Jar包打包配置:
- 确认Eclipse打包时指定的主类是
main.FirefoxServer,无配置错误。若主类路径写错,JarRsrcLoader可能误找其他类的方法,引发权限问题。 - 检查打包是否包含所有依赖类,特别是
main.FirefoxServer类是否正确打包进Jar包对应路径。可执行命令jar tf yourJarName.jar查看Jar包内文件结构,确认main/FirefoxServer.class存在。
- 确认Eclipse打包时指定的主类是
- 排查类加载器冲突:JarRsrcLoader是Eclipse的Jar-in-Jar加载器,可能和代码中的类加载逻辑冲突。尝试换用普通可执行Jar打包方式(指定主类,将依赖单独放在lib目录,通过MANIFEST.MF指定Class-Path),再运行测试是否仍有异常。
- 验证JDK版本兼容性:对比Eclipse使用的JDK版本和命令行运行的JDK版本是否一致。不同JDK版本的反射权限检查逻辑可能存在差异,部分旧版本JDK对跨类加载器的反射访问限制更严格。可通过
java -version查看命令行JDK版本,再和Eclipse偏好设置中的Java Compiler、Installed JREs配置对比。 - 手动模拟反射调用测试:编写简单测试类模拟JarRsrcLoader的反射逻辑,验证问题根源:
public class TestReflection { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("main.FirefoxServer"); Method method = clazz.getMethod("main", String[].class); method.invoke(null, new Object[]{new String[]{}}); } }
编译后在命令行运行该测试类,若同样出现异常,说明是类本身的权限或签名问题;若能正常运行,说明是JarRsrcLoader的加载环境问题,需调整打包配置。
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

