Java 1.8 Update 121(1.8.0_121-b13)致Applet崩溃求助
解决Java 1.8.0_121下Applet崩溃的FileNotFoundException问题
我之前维护Java Applet项目时,刚好碰到过和你完全一样的问题——在Java 1.8 Update 121环境下运行时崩溃,抛出java.io.FileNotFoundException: ../classes/META-INF/services/javax.xml.soap.MetaFactory错误。折腾了好一阵才找到几个靠谱的解决办法,分享给你:
1. 检查并修复JAR包的META-INF/services目录
这个错误本质是JDK的**服务提供者机制(SPI)**找不到对应的实现类配置文件。你需要:
- 确认项目中存在
META-INF/services/javax.xml.soap.MetaFactory文件,文件内容要明确指定MetaFactory的实现类,比如JDK默认的com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl - 打包Applet的JAR时,确保这个目录结构被完整包含进去——很多时候是打包脚本或IDE配置漏了这个目录,导致运行时找不到文件
2. 调整Java安全策略文件
Java 1.8u121大幅加强了Applet的安全限制,默认情况下Applet没有权限读取文件系统中的相对路径文件。你可以修改Java的安全策略文件(java.policy,通常在JRE/lib/security目录下),给你的Applet添加读取权限:
grant codeBase "http://你的Applet部署域名或IP/" { permission java.io.FilePermission "../classes/-", "read"; };
⚠️ 注意:尽量缩小权限范围,不要给全局的读取权限,避免安全风险。
3. 替换兼容的SAAJ/JAX-WS依赖库
如果你的Applet依赖了第三方的SAAJ(SOAP with Attachments API for Java)或JAX-WS库,旧版本可能和Java 1.8u121存在兼容性问题。建议:
- 移除项目中过时的
saaj-api.jar、saaj-impl.jar等依赖 - 改用与JDK 1.8版本匹配的官方库,或者直接使用JDK内置的SAAJ实现(避免依赖冲突)
4. 避免使用文件系统路径,改用类加载器读取
相对路径../classes在Applet的沙箱环境中很容易出现路径错位的问题。建议修改代码,通过类加载器来读取SPI配置文件,而不是直接操作文件:
InputStream is = Thread.currentThread().getContextClassLoader() .getResourceAsStream("META-INF/services/javax.xml.soap.MetaFactory"); // 后续用InputStream处理配置内容
这种方式会从Applet的JAR包或类路径中读取文件,更符合Applet的运行环境要求。
额外排查步骤
- 先确认
../classes/META-INF/services/javax.xml.soap.MetaFactory这个路径在部署环境中是否真的存在,有时候是部署时的目录结构错误导致路径不匹配 - 检查Applet的
codebase参数是否配置正确,错误的代码基会导致类加载路径混乱
内容的提问来源于stack exchange,提问作者poojamps22
相关产品推荐
相关产品推荐

