Java 9 WebStart重复加载Jar文件问题求助
问题梳理
从JRE 9.0.4开始,你的Swing WebStart应用遇到了棘手的性能问题:6MB的主Jar文件被频繁重复从服务器加载,每次访问Jar内资源都会触发加载请求,直接导致应用运行卡顿。而JRE 8环境下完全正常,且Jar文件的修改时间从未变动,JNLP里的版本控制配置也没起到预期作用,控制台反复输出这类连接日志:
network: Verbindung von http://myurl.net/application.jar mit Proxy=DIRECT wird hergestellt network: Verbindung von http://myurl.net/application.jar mit Proxy=DIRECT wird hergestellt ...
可行的解决思路
检查JRE 9+的缓存机制变化
JRE 9对WebStart的缓存校验逻辑做了调整,你可以先手动清理WebStart缓存试试:打开命令行执行javaws -uninstall清除所有缓存,再重新启动应用。另外,也可以在Java控制面板里调整缓存大小和过期策略,确保缓存空间足够,且允许长期缓存未修改的资源。修正JNLP文件的资源声明
确认JNLP中主Jar的version属性配置正确,同时检查是否添加了download="eager"属性。JRE 9+对懒加载(download="lazy")的资源校验更严格,哪怕资源没更新,也可能反复发起校验请求。建议把主Jar的声明改成:<jar href="application.jar" version="x.y.z" download="eager"/>强制应用启动时就完整下载并缓存主Jar,避免后续访问资源时重复请求。
排查服务器的HTTP缓存响应头
服务器返回Jar文件时的HTTP响应头是客户端缓存的关键。确保服务器返回的Cache-Control、ETag、Last-Modified头信息配置正确:Cache-Control要包含max-age设置(比如max-age=31536000表示缓存1年),同时加上public或private标识;Last-Modified要准确对应Jar文件的最后修改时间;- 避免返回
no-cache或must-revalidate这类会强制客户端每次校验的头。
JRE 9+对HTTP缓存头的校验比JRE 8更严格,如果服务器头配置不对,会导致客户端反复发起请求校验资源。
尝试添加JVM参数禁用过度校验
可以在JNLP的j2se标签里添加JVM参数,关闭WebStart的部分资源校验特性,比如:<j2se version="9+" java-vm-args="-Djnlp.cache.disableDownloadTimeout=true -Djnlp.versionEnabled=false"/>注意
-Djnlp.versionEnabled=false可能会影响版本控制功能,需要测试后再决定是否保留。升级JRE版本或切换到OpenWebStart
这个问题大概率是JRE 9.0.4的特定bug,Oracle后续的JRE 9小版本(比如9.0.7+)可能已经修复了缓存逻辑问题。另外,Oracle已经停止维护传统WebStart,推荐切换到OpenWebStart(开源的WebStart替代方案),它对JRE 8+的兼容性更好,缓存机制更稳定,能解决很多传统WebStart在高版本JRE下的问题。
内容的提问来源于stack exchange,提问作者Danny

