Applet的getCodeBase返回null

时间:2013-09-02 07:54:13

标签: java file applet

我有一个applet,需要打开一个文件流。此文件是位于applet和HTML文件所在位置的本地文件:

    URL localURL = new URL(getCodeBase(), "pixs/icons.zip");
    InputStream localInputStream =localURL.openStream();

它曾经工作正常,但在升级到java 1.7 build 25之后,getCodeBase()总是返回null。 这实际上是有记录的!唉 - 没有建议如何克服它。

一件有用的事情是使用完整路径:

   URL localURL = new URL("file:c:/myFolder/pixs/icons.zip");

是否有其他选项可以在不使用完整路径的情况下解决此问题?

1 个答案:

答案 0 :(得分:2)

也许您可以使用getDocumentBase代替。取决于您的设置结构,代码库和文档之间是否存在密切关系。没有永久解决方案:getDocumentBase在7u40中以相同的方式进行了修改,根据{{3} }。

如果没有,那么您可以尝试使用bug #8019177从您的JAR获取网址,例如applet的类文件,然后反汇编该URL以获取JAR的位置,从而得到代码库。这是未经测试的,因此如果您尝试这样做,请随时编辑此帖子。

最后但同样重要的是,由于该更改仅影响本地小程序,因此您可以运行(本地或公共)Web服务器来提供该小程序。

如果您想要更正式的声明,我会引用getResource

  

如果applet需要加载资源:

     
      
  • 如果资源在applet JAR中,他们应该可以直接用the #8017250 bug report加载它,而不需要代码库信息。
  •   
  • 如果资源位于仲裁位置,而不是applet JAR内部,则应该有其他方式到达该位置,因为它无论如何都不是applet资源的一部分。 (例如user.home java系统属性,前提是他们的applet具有所有权限)
  •   

ClassLoader.getResoruceAsStream(感谢http://www.duckware.com/tech/java-security-clusterfuck.html)提到了其他一些选择。受到未来Oracle修改apprers影响的最不可能的是在包含HTML页面中使用location.href,例如从JavaScript编写<applet>标记。