Java 小程序中的类加载器:Can';无法访问文件

Java 小程序中的类加载器:Can';无法访问文件,java,security,applet,classloader,sandbox,Java,Security,Applet,Classloader,Sandbox,我有一个应用程序,它使用反射来实例化保存在某个目录中的代码:我创建一个URLClassLoader,然后使用提供的URL加载类;这个很好用。我尝试将应用程序移植到小程序。为了加载文本文件和图像,我将代码从使用相对路径改为使用getResourceAsStream(),这非常有效。但是,对于类加载器,我仍然有一个I/O异常(在我将代码更改为使用流之前,我还使用文本文件和图像获取该异常): 要加载的类包含在jar文件中(与所有其他资源一样)。有没有办法使用不调用安全异常的getResourceAsS

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

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

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

“我的小程序”位于a包a.MyApplet中,该包使用类a.aa.Loader,用于加载存储在另一个文件夹b中的类(因此在加载小程序时不会加载)。文件夹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,[U c2,…}其中c_I={[x]}、[x]={[y]}、[y]={[z]}最后是[z]={Class.Class}。希望符号不要太奇怪

编辑2:更多细节

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


注意:我尝试了一个签名的小程序,它不再抛出安全异常,而是IO异常:它找不到文件。我检查了目录结构并尝试了许多变体,结果都是一样的(它在我的本地机器上工作)。我不确定这是否真的是一个IO问题,或者它是否仍然是一个安全问题。

事实上,将一个项目作为一个单独的对象范围保留是一个坏基调,所以

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

  • 在这种情况下,您将类保留在服务器上只是因为整个 项目太大,您可以使用pack200 util压缩它 非常有助于Java Web Start胖客户端小程序

  • 我建议使用jnlp小程序启动类型,因为它提供 更多的选择与它的

附言

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

例如,创建类似

  • |-包装图片-
  • |imageA.png
  • |imageB.png
  • |主播级
  • |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.java

public class Test
{

SourceBound sourceBound=new SourceBound();

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

}

}

祝你好运

事实上,将一个项目作为一个单独的对象范围,这是一个坏基调,所以

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

  • 在这种情况下,您将类保留在服务器上只是因为整个 项目太大,您可以使用pack200 util压缩它 非常有助于Java Web Start胖客户端小程序

  • 我建议使用jnlp小程序启动类型,因为它提供 更多的选择与它的

附言

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

例如,创建类似

  • |-包装图片-
  • |imageA.png
  • |imageB.png
  • |主播级
  • |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.java

public class Test
{

SourceBound sourceBound=new SourceBound();

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

}

}

祝你好运

FilePermission中的路径是否与某个资源相关?@jtahlborn是的,我刚刚将目录名替换为。。。jar文件的结构如下:[图像][数据][要加载的文件][包]。要加载的文件位于它们自己的目录中,实际的小程序代码位于[package]中。所有内容都在jar文件中。@AndrewThompson:但是要加载的类在jar文件中的一个目录中。为什么它与作为小程序一部分加载的类不同?@coderino您是否对小程序进行了签名?@FrozenSpider否,当前未对其进行签名。我可以签字,但不愿意(我想人们可能会因此而反感)。但是,如果这是唯一的解决方案,我当然会这样做。FilePermission中的路径是否与其中一个资源相关?@jtahlborn是的,我只是将目录名替换为。。。jar文件的结构如下:[图像][数据][要加载的文件][包]。要加载的文件位于它们自己的目录中,实际的小程序代码位于[package]中。所有内容都在jar文件中。@AndrewThompson:但是要加载的类在jar文件中的一个目录中。为什么它与作为小程序一部分加载的类不同?@coderino您是否对小程序进行了签名?@FrozenSpider否,当前未对其进行签名。我可以签字,但不愿意(我想人们可能会因此而反感)。但是,如果这是唯一的解决办法,我当然会这样做。