FileNotFoundException加载jar文件甚至存在该文件

时间:2015-10-01 12:51:16

标签: java file jar

我有一个应用程序将一个jar文件加载到根文件夹的lib文件夹中,当我把这个根文件夹放在C:\或C:\ somefolder中工作正常,但当我放入“Program Files(x86)时)“在管理模式下返回FileNotFoundException甚至现有并运行cmd。

    JarFile jf;
    Image img = null;
    compuservice = new FrmPrincipal();
    compuservice.setVisible(true);
    System.out.println("Path of MainClass: " + Main.class.getResource("Main.class").getPath());
    System.out.println("Path Icon over MainClass: " + Main.class.getResource("Icon.png").toString());
    System.out.println("Path Icon over compuservice: " + compuservice.getClass().getResource("Icon.png").toString());
    System.out.println("Path Main.class: " + Main.class.getProtectionDomain().getCodeSource().getLocation().getPath());
    if(compuservice.getClass().getResource("Icon.png").toString().contains("jar")){
        jf = new JarFile(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath());
        Enumeration<JarEntry> entries = jf.entries();
        while(entries.hasMoreElements()){
            JarEntry entrie = (JarEntry)entries.nextElement();
            if(entrie.getName().contains("Icon.png")){
                img = ImageIO.read(ImageIO.createImageInputStream(jf.getInputStream(entrie)));
                break;
            }
        }
        if(img == null)
            img = ImageIO.read(compuservice.getClass().getResource("javax/swing/plaf/basic/icons/JavaCup16.png"));
        compuservice.setIconImage(img);         
    }

我得到System.out.println来调试信息并返回正确的路径。

来自app的println的Stacktrace:

MainClass的路径:file:/ C:/ Program%20Files%20(x86)/CompuForte/compuservice/CompuService-0.0.13.4.3-SNAPSHOT.jar!/com/compu/server/main/Main.class

MainClass上的路径图标:jar:file:/ C:/ Program%20Files%20(x86)/CompuForte/compuservice/CompuService-0.0.13.4.3-SNAPSHOT.jar!/com/compu/server/main/的icon.png

compuservice上的路径图标:jar:file:/ C:/ Program%20Files%20(x86)/CompuForte/compuservice/CompuService-0.0.13.4.3-SNAPSHOT.jar!/com/compu/server/main/的icon.png

Path Main.class:/ C:/ Program%20Files%20(x86)/CompuForte/compuservice/CompuService-0.0.13.4.3-SNAPSHOT.jar

Exception in thread "main" java.io.FileNotFoundException: C:\Program%20Files%20(x86)\CompuForte\compuservice\CompuService-0.0.13.4.3-SNAPSHOT.jar (O sistema não pode encontrar o caminho especificado)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at com.compu.server.main.Main.InitInstance(Main.java:37)
        at com.compu.server.main.Main.<init>(Main.java:24)
        at com.compu.server.main.Main.main(Main.java:102)
2015-10-01 10:11:16.384:INFO::AWT-EventQueue-0: Logging initialized @521ms
C:\Program%20Files%20(x86)\CompuForte\compuservice\lib
0 [AWT-EventQueue-0] ERROR com.compu.ws.rest.app.AppWS  -
null

1 个答案:

答案 0 :(得分:1)

我可以看到问题所在。以下是您尝试使用代码的路径:

C:\程序%20Files%20(86)\ CompuForte \ compuservice \ CompuService-0.0.13.4.3-SNAPSHOT.jar

注意%20?这是一个&#34;百分比编码&#34;空间特征。它应该是一个真实的空间角色。

伪造百分比编码来自何处?

下面:

Main.class.getProtectionDomain().getCodeSource().getLocation().getPath()

getLocation()调用返回URL,然后您调用getPath()来提取URL的路径组件。问题是该方法没有解码&#34;编码。

解决这个问题的一种方法是使用URL.toURI()获取URI个对象,然后调用URI.getPath()。我认为最好使用new File(url.toURI()) ...这将在边缘情况下给出异常 1 ,其中类的CodeSource不是文件中的本地文件系统。

1 - 这是一件好事。另一种方法是你试图解释(例如)&#34; http://...&#34; URL作为文件路径。哎呀!