JNLP重复下载问题:本地Tomcat部署+未签名是否为诱因?
关于Web Start应用重复下载JNLP文件的问题解答
嘿,这两个因素确实都有可能导致你遇到的每次启动都重新下载JNLP文件的问题,我来给你拆解说明下:
1. 本地Tomcat部署的影响
Tomcat默认的HTTP缓存配置对JNLP这类文件没做针对性优化。Web Start客户端会检查JNLP文件的缓存有效性,如果服务器返回的响应头里没有合适的缓存控制字段(比如Cache-Control、Expires),或者返回的是no-cache/must-revalidate这类强制重新校验的指令,Web Start就会每次都重新下载JNLP文件,而不是用本地缓存的版本。
你可以试试在Tomcat的conf/web.xml里添加针对.jnlp文件的缓存配置,比如:
<mime-mapping> <extension>jnlp</extension> <mime-type>application/x-java-jnlp-file</mime-type> </mime-mapping> <filter> <filter-name>ExpiresFilter</filter-name> <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class> <init-param> <param-name>ExpiresByType application/x-java-jnlp-file</param-name> <param-value>access plus 1 day</param-value> </init-param> </filter> <filter-mapping> <filter-name>ExpiresFilter</filter-name> <url-pattern>*.jnlp</url-pattern> </filter-mapping>
这样配置后,Tomcat会给JNLP文件设置1天的缓存有效期,Web Start客户端就不会每次都重新下载了。
2. 应用未签名的影响
未签名的Web Start应用会受到更严格的安全限制,其中就包括缓存策略。Java Web Start对未签名的资源(包括JNLP文件和应用JAR包)会采用更保守的缓存行为,甚至可能强制每次启动都重新下载——毕竟未签名的文件有被篡改的风险,频繁校验能降低安全隐患。
如果要解决这个问题,最直接的办法就是给应用签名。你可以用keytool生成密钥库,再用jarsigner给JAR包和JNLP文件签名(注意部分Java版本要求JNLP文件也需要签名)。签名后,Web Start会信任这些资源,允许更合理的缓存策略。
额外可以排查的点
除了上面两个因素,你还可以检查下JNLP文件本身的配置:
- 有没有在JNLP的
<information>节点里设置offline-allowed="true"?这个属性会告诉Web Start允许离线使用,从而优先用缓存的资源。 - 检查JNLP里指定的JAR包版本号是不是每次都变化,如果版本号是动态生成的,也会让Web Start误以为是新资源而重新下载。
内容的提问来源于stack exchange,提问作者Sibi John
相关产品推荐
相关产品推荐

