Web applications 如何使用JnlpDownloadServlet访问webapp的webstart目录中jar内的资源

Web applications 如何使用JnlpDownloadServlet访问webapp的webstart目录中jar内的资源,web-applications,jnlp,java-web-start,Web Applications,Jnlp,Java Web Start,我已经在servlet容器(Glassfish 3.0)中将swing GUI via和JNLDownloadServlet部署到我的webapp中。 我的GUI类和资源位于mygui-4.8.jar文件中,该文件与launch.jnlp文件一起位于我的webapp的webstart目录中 通过web浏览器中的launch.jnlp url进行访问时,应用程序可以正常启动: 但是,当我的webapp中的代码试图访问mygui-4.8.jar文件中的图像资源时,它无法检索它 我在GUI中用于获取

我已经在servlet容器(Glassfish 3.0)中将swing GUI via和JNLDownloadServlet部署到我的webapp中。 我的GUI类和资源位于mygui-4.8.jar文件中,该文件与launch.jnlp文件一起位于我的webapp的webstart目录中

通过web浏览器中的launch.jnlp url进行访问时,应用程序可以正常启动:

但是,当我的webapp中的代码试图访问mygui-4.8.jar文件中的图像资源时,它无法检索它

我在GUI中用于获取图标的代码是:

URL iconURL=getClass().getClassLoader().getResource(“/icons/Find.png”)

使用调试器,我看到iconURL.toString()返回以下URL:

罐子:http://localhost:8080/myserver/webstart/mygui.jar!/icons/Find.png

我注意到jar文件名中缺少该版本(是mygui.jar而不是mygui-4.8.jar)

这似乎与jnlp协议中的版本处理有关

有人能告诉我应该如何重写我的客户机代码以获取jar文件中的这些资源吗?谢谢您的帮助。

中的问题已解决

这个问题原来是我代码中其他地方的一个bug,与webstart、jnlp或JnlpDownloadServlet无关。在生成过程中意外预处理图像资源的方式存在缺陷,导致图像资源损坏

参考资源的正确方法是我最初使用它的方式,如下所示:

String icon = "icons/Find.png"; //Notice no leading '/'
URL url = getClass().getClassLoader().getResource(icon);            
ImageIcon imageIcon = new ImageIcon(url);

当资源位于webapp的webstart目录的jar中时,上述代码可以正常工作。如果在类路径上找到它作为本地文件,它也可以正常工作。无论应用程序是在javaws内运行,还是作为javaws外的独立应用程序运行,它都是有效的。

我建议您使用JaNeLA()检查JNLP文件(和主要资源)。进一步调试后,我了解到,对于mygui-4.8.jar中的jar,只有一次访问JnlpDownLoadServlet。显然,javaws在客户端缓存这个jar,并在本地提供对该jar的任何请求,而无需联系JnlpDownloadServlet。但是,对于访问jar中Find.png文件的URL,javaws似乎没有正确处理jar协议。有没有一个特殊的技巧可以让它发挥作用?这可能与。。。[将返回报告。我尝试了使用以下内容的rachel教程方法,但没有改变任何内容:URL.setURLStreamHandlerFactory(new RachelUrlFactory());