如何从jar中获取jar URL:包含“!”的URL和jar中的特定文件?

我在运行时获得了一个jar文件URL:

jar:file:///C:/proj/parser/jar/parser.jar!/test.xml 

如何将其转换为有效路径:

 C:/proj/parser/jar/parser.jar. 

我已经尝试使用File(URI)getPath()getFile()是徒劳的。

如果MS-Windows没有被前导斜杠冒犯,这可能会这样做:

  final URL jarUrl = new URL("jar:file:/C:/proj/parser/jar/parser.jar!/test.xml"); final JarURLConnection connection = (JarURLConnection) jarUrl.openConnection(); final URL url = connection.getJarFileURL(); System.out.println(url.getFile()); 

不确定能给你什么的确切方法,但这应该让你接近:

 import static org.junit.Assert.assertEquals; import java.net.URL; import org.junit.Test; public class UrlTest { @Test public void testUrl() throws Exception { URL jarUrl = new URL("jar:file:/C:/proj/parser/jar/parser.jar!/test.xml"); assertEquals("jar", jarUrl.getProtocol()); assertEquals("file:/C:/proj/parser/jar/parser.jar!/test.xml", jarUrl.getFile()); URL fileUrl = new URL(jarUrl.getFile()); assertEquals("file", fileUrl.getProtocol()); assertEquals("/C:/proj/parser/jar/parser.jar!/test.xml", fileUrl.getFile()); String[] parts = fileUrl.getFile().split("!"); assertEquals("/C:/proj/parser/jar/parser.jar", parts[0]); } } 

希望这可以帮助。

有些人可能认为这有点’hacky’,但它会在那个例子中完成工作,我确信它比在其他建议中创建所有这些对象更能表现得更好。

 String jarUrl = "jar:file:/C:/proj/parser/jar/parser.jar!/test.xml"; jarUrl = jarUrl.substring(jarUrl.indexOf('/')+1, jarUrl.indexOf('!')); 

此解决方案将处理路径中的空间。

 String url = "jar:file:/C:/dir%20with%20spaces/myjar.jar!/resource"; String fileUrl = url.substring(4, url.indexOf('!')); File file = new File(new URL(fileUrl).toURI()); String fileSystemPath = file.getPath(); 

或者以URL对象开头:

 ... String fileUrl = url.getPath().substring(0, url.indexOf('!')); ... 

我只是必须这样做。

  URL url = clazz.getResource(clazz.getSimpleName() + ".class"); String proto = url.getProtocol(); boolean isJar = proto.equals("jar"); // see if it's in a jar file URL if(isJar) { url = new URL(url.getPath()); // this nicely strips off the leading jar: proto = url.getProtocol(); } if(proto.equals("file")) { if(isJar) // you can truncate it at the last '!' here } else if(proto == "http") { ... 
  //This code will work on both Windows and Linux public String path() { URL url1 = getClass().getResource(""); String urs=url1.toString(); urs=urs.substring(9); String truepath[]=urs.split("parser.jar!"); truepath[0]=truepath[0]+"parser.jar"; truepath[0]=truepath[0].replaceAll("%20"," "); return truepath[0]; } 

你可以这样做。这很有效

  ClassLoader loader = this.getClass().getClassLoader(); URL url = loader.getResource("resource name"); String[] filePath = null; String protocol = url.getProtocol(); if(protocol.equals("jar")){ url = new URL(url.getPath()); protocol = url.getProtocol(); } if(protocol.equals("file")){ String[] pathArray = url.getPath().split("!"); filePath = pathArray[0].split("/",2); } return filePath[1];