我目前正在研究的Web应用程序嵌入<applet>
,它有几个依赖项(.jar文件(。
Applet标签看起来像这样:
<applet ...
type="application/x-java-applet"
codebase="/webapp/applet">
...
<param name="codebase" value="./applet"/>
<param name="archive" value="a.jar,b.jar,c.jar"/>
<param name="codebase_lookup" value="false"/>
</applet>
Applet工作正常,但问题是,当它第一次加载时,这些a.jar、b.jar、c.jar等被从web服务器MANY(20-300(次请求(和下载(,每次都很慢。
发生了什么,是不是每个加载的类都会分别重新下载jar?
是否有适当优化/配置小程序的方法?尝试了几个缓存技巧(比如<param name="cache_archive" />
,但没有成功,甚至不确定这是解决这个问题的正确方法
NB!这个小程序是WS客户端(具有一些JAXB注释的类和相关依赖项(。
Applet登录启动有很多这样的功能:
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
... ~100 more times a.jar is downloaded
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/b.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/b.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/c.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/a.jar with proxy=DIRECT
network: Connecting http://127.0.0.1:7001/webapp/applet/c.jar with proxy=DIRECT
...
Web服务器访问日志反映小程序日志:
127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582
127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582
127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582
...
127.0.0.1 - "GET /webapp/applet/a.jar HTTP/1.1" 200 1232582
之所以会发生这种情况,是因为在CXFURL.openStream()
用于访问来自jar的不同资源(模式、wsdls等(。
通过用类加载器中的getResourceAsStream()
方法替换URL.openStream()
解决了问题(显然Applet2ClassLoader.getResource().openStream()
进行了不必要的连接,而Applet2ClassLoader.getResourceAsStream()
没有(。
更新:它似乎正在处理Java7插件,但不是Java6插件。