Applet中的类加载器:无法访问文件

时间:2011-09-20 11:24:05

标签: java security applet classloader sandbox

我有一个使用反射实例化保存在某个目录中的代码的应用程序:我创建了一个URLClassLoader,然后使用提供的URL加载类;这很好用。我试图将应用程序移植到Applet。为了加载文本文件和图像,我使用相对路径更改了代码以使用getResourceAsStream(),这非常有用。但是,对于类加载器,我仍然有一个I / O异常(在我更改代码以使用流之前,我还习惯使用文本文件和图像):

java.security.AccessControlException: access denied (java.io.FilePermission /.../... read)

要加载的类包含在jar文件中(与所有其他资源一样)。有没有办法使用不调用安全异常的getResourceAsStream()之类加载类?请注意:我在谈论从java代码中调用的类加载器,而不是加载applet的类加载器。

编辑:有关文件/文件夹结构的更多详细信息:

我的applet位于包a,.myApplet中,它使用了一个类a.aa.Loader,用于加载存储在另一个文件夹b中的类(因此在加载applet时不会加载)。文件夹b包含许多目录b.c_i,其中c_i是唯一目录。在每个目录中都是属于包x.y.z的类,因此b的整体文件夹结构是b.c_i.x.y.z; z包含要加载的文件。当我创建jar时,顶级看起来如下([]表示文件夹):[a],[b],[data],[images]其中[a] = {MyApplet,[aa],[aaa] ,等等。}和[b] = {c_1,_c2,...}其中c_i = {[x]},[x] = {[y]},[y] = {[z]},最后[z ] = {} Class.class。希望符号不是太奇怪。

Edit2:更多细节。

澄清一下:我要加载的类是其他人的类,都放在一个单独的目录“DIR”中(它们不是项目的一部分,也不是自己组成的项目)。实际上,所有这些类名都是相同的,它们存储在“DIR”中的唯一目录中。我需要一次加载一个文件。换句话说,我想像任何其他资源一样对待类文件。

注意:我尝试了一个已签名的applet,它不再引发安全性异常,而是一个IO:它无法找到该文件。我检查了目录结构并尝试了很多变种,都具有相同的结果(它适用于我的本地机器)。我不确定它是否真的是一个IO问题,或者它是否仍然是一个安全问题。

1 个答案:

答案 0 :(得分:1)

实际上,将一个项目作为一个单独的对象区分,这是一个糟糕的基调,所以......

  • 您可以将所有项目打包到一个jar文件中。

  • 如果您将课程保留在服务器上仅仅是因为整体 项目太大你可以使用pack200 util压缩它 对Java Web Start胖客户端小程序非常有用

  • 我建议使用jnlp applet启动类型,因为它提供了 其DeployJava.js

  • 的更多选项

P.S。

如果你真的坚持用类加载器加载资源,那就用applet标准方式做,我的意思是用一个Anchor对象

例如创建像

这样的结构
  • | - 包图像 -
  • | imageA.png
  • | imageB.png
  • | Anchor.class
  • | SourceBound.class

SourceBound.java

public class SourceBound
{

  /**
    Conception only...
  **/
  public SourceBound(){}

  public ImageIcon getImageA()
  {
    ImageIcon icon;
    Image image;

    image=ImageIO.read(Anchor.class.getResourceAsStream("imageA.png"));
    icon=new ImageIcon(image);

    return icon;
  }
}

  • |包测试
  • |的Test.class

Test.java

public class Test
{

SourceBound sourceBound=new SourceBound();

Test()
{
  JButton button=new JButton();
  button.setIcon(sourceBound.getImageA());

}

}
祝你好运