一个项目(guanli),有2个包(src、db),src中放着.java文件,db放的是数据,sre包中的.java程序如何获取到db包中的数据?如何获取项目里(非包内)的ico.jpg文件????
程序运行没有问题,但是打成.jar文件后就不能运行了,问题就是不能读取其他包的内容。
setIconImage( new ImageIcon( getClass().getResource("../Icon.jpg") ).getImage() );
import db.*;
getClass().getResource("db/a.txt");guanli
  |
  |__sre包
  |
  |__db包
  |
  |__ico.jpg (图像文件)

解决方案 »

  1.   

    把图片文件等,放到bin目录下,也就是和class文件同一文件夹下,然后用你的
    setIconImage( new ImageIcon( getClass().getResource("../Icon.jpg") ).getImage() ); 应该就可以读到了。
    如果实在读不到,可以把jar导出后,再把图片文件放进去
      

  2.   

    1.
    在sre的包里面一个类里面执行以下代码:
    File f =  new File(Thread.currentThread().getContextClassLoader().getClass().getProtectionDomain().getCodeSource().getLocation().getFile());
    注意:如果是使用的标准的或者规范的classLoader加载的类都会正确返回,否则有可能空指针
    if (f.isDirectory()){
        //说明为工程模式,未打包.此时f为 "工程目录/bin"
    } else if (f.isFile()) {
        //说明是jar包形式,f为sre包.
    }此时就可以得到sre包的物理路径,然后找到db包fdb.
    JarFile jar = new JarFile(fdb,false);
    JarEntry entry = jar.getJarEntry("a.txt");
    InputStream is = jar.getInputStream(entry)2.
            try {
                url = clazz.getResource("");            url = new URL(url.getFile().substring(0 , url.getFile().indexOf("!/")));
                 if (url != null) return url;
            } catch(Exception e) {
                url = null;
            }
      

  3.   

    是不是,需要这么多的方法么???Thread.currentThread().getContextClassLoader().getClass().getProtectionDomain().getCodeSource().getLocation().getFile()); 有简单点的方式没啊???
      

  4.   

    把需要导入的java文件放入发布的文件内,通过相对路径请求应该没问题
      

  5.   

    有一个eclipse的打包插件叫做fatjar的,你试一下,应该可以
      

  6.   

    1 你确认jar里面有那个jpg文件吗?
    2 在jar里用如下的方法读取文件内容
    读取 jar 里面的文件内容
      

  7.   

    要不只有从根目录开始寻找。getClass().getResource("guanli/db/Icon.jpg") 
      

  8.   

    getClass().getResource("/guanli/db/Icon.jpg")
     少了个斜杠。 
      

  9.   


    这个是我前一段研究自定义ClassLoader的成果,我忘了为什么最终选取这种方式了,但是确实是通用性最强的方式.