我有一个应用程序将一个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
答案 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作为文件路径。哎呀!