这是一个难题!
我在 JAR 中有一个小程序。 当 JAR 签名时 - 无论是自签名还是使用 DigiCert 证书 - 我在主小程序类上得到一个
ClassNotFoundException
。
当我不签署小程序时,它加载得很好 - (不计算预期的SecurityException
,因为代码未签名)。
但是我可以打开签名的 JAR 并发现所有内容都在它应该在的地方。
最奇怪的部分是,直到上周,设置都运行得很好。 相同的主类、自签名、相同的 JS/HTML 部署混合等
有什么想法吗?
这是错误消息:
java.lang.ClassNotFoundException: com.spraklab.ilos.applet.Applet
at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:195)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:249)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:179)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:160)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Plugin2ClassLoader.java:690)
at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3045)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1497)
at java.lang.Thread.run(Thread.java:680)
在上面的代码中,您尝试切换安全小程序类加载器。从 Java 1.2 开始这是不允许的。
简短版本: JAR 名称中没有连字符!
戏剧性的故事: 最后! 发现问题后的许多工作日。 小程序在未签名时加载正常,在签名时出现 ClassNotFoundException。 关于类加载器切换的答案让我相信我的代码中有些东西已经改变了。 所以我将代码精简到最少。 但为了避免一直重新启动浏览器并清空缓存等,我只是使用了 Chrome 的隐身模式。 我重建了代码。最后一切都很好。不是! 当我在隐身模式之外测试它时,我再次收到错误。
那么有什么区别呢? 对服务器日志的检查表明,在常规模式下,服务器根本没有请求 Jar! 我再次将我的代码与具有类似嵌入代码的不同应用程序进行比较,只看到一个区别:我在 JAR 名称中使用连字符而不是下划线 - 这应该是允许的,并且一直运行良好,直到大约两周前。 但大约两周前不是也有 Java 更新吗...?!?!