我最近在做一个C/S工作模式的小工程交作业,可是我在将程序打包为JAR的时候遇到了这样一个问题----无法获得在JAR包同级目录下的一个文件资源,使用URL类是我的最后一个办法,如果高手知道别的方法,也请您不吝赐教,谢谢,老师催的真的很急.目录结构的大致描述:
        程序文件夹(ChatClient)与资源文件夹(doc)位于同一个目录;
        main.java在程序文件夹中,template.htm在资源文件夹中;
        main.java中实例化了一个URL类,想通过JEdtorPane.setPage(URL);方法来读取template.htm.问题描述:
        不可以使用 URL HtmlUrl=new URL("file:///c:/NetChatHall/doc/template.htm"); 这种绝对定位的方式(因为这样封装成JAR包以后程序就不能在任何一个目录下运行了);
        也不能使用 this.getClass().getResource("../doc/template.htm") 这种相对定位方式获得资源(因为这样封装成JAR包以后就读不到外部资源了);请高手现身说法,先拜谢一下,我真的快急疯了~

解决方案 »

  1.   

    一般都要设置一个路径的啊,比如你的程序在c:\java下,你的包放在c:\java\lib下,那么你需要写一个运行的run.bat文件,在这里使用java com.test.Main c:\java就行了。
    也就是在你的run.bat中为Main的public static void main(String args[])设置一个参数,然后用args[0]得到这个路径,使用System.setProperty("apppath",args[0])设置一个环境变量。然后你要取的时候就可以用System.getProperty("apppath")来得到你的应用程序路径,那么每个包就可以使用绝对路径来取了。比如apppath+"/lib/ss/cc/template.htm"就行了。
      

  2.   

    至于你说的URL的那个东西,也可以啊。还不是一样的道理,你写个配置文件conf.properties,然后把路径写到里面不就行了么?然后用Properties类来读这个路径就是了。
      

  3.   

    我看明白了您的意思,可是按照您的说法与URL HtmlUrl=new URL("file:///c:/NetChatHall/doc/template.htm"); 没有任何区别,使用的都是绝对定位的方式,无法在任意一个目录内运行程序,我的想法是JAR包内部的程序能够使用相对定位的方式获得外部的文件资源,就象读取图片文件那样,image=new ImageIcon("ChatServer/images/1.gif");
    不过还是谢谢您的回答,结贴一定送分.
      

  4.   

    为什么一定要用相对路径呢?你在程序中可以使用相对路径啊,在具体读的时候只要使用你外部设置的那个路径+相对路径,就是你具体要拿到的实际图片路径了,不是吗?因为jar包的根路径是/,如果你的程序是com.test.Test,那实际jar包路径就是/com/test,所以你没有办法拿到真正的jar包路径的。image=new ImageIcon("ChatServer/images/1.gif");你换成image=new ImageIcon(apppath+"ChatServer/images/1.gif");不就可以了吗?至于apppath,是你自己根据外界环境所设置的,不是已经达到你的要求了吗?
    你是不是想说apppath这个路径你也想用java直接拿到呢??这个比较麻烦,一般都是根据你的项目路径来设置这个appath的,直接获得比较麻烦,我还没见过哪个程序能直接拿到。用ant到是可以,不过ant也是因为你的build.xml和ant_home结合才取到的。
      

  5.   

    不写路径就是程序的主路径啊
    比如图片把
    a.jpg
    /subPackage
       a.jpg你用Toolkit.getDefaultToolkit().getImage("a.jpg");
    调用a.jpg
    Toolkit.getDefaultToolkit().getImage("subPackage\\a.jpg");
    调用subPackage\\a.jpgURL的话也一样的以后弄出程序打jar
    a.jar
    a.jpg用Toolkit.getDefaultToolkit().getImage("a.jpg");
    subPackage\\a.jpg用Toolkit.getDefaultToolkit().getImage("subPackage\\a.jpg");