Как получить только URL-адрес jar-файла из jar: URL-адрес, содержащий "!" а конкретный файл в банке? - PullRequest
17 голосов
/ 31 декабря 2008

Я получаю URL файла JAR во время выполнения как:

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

Как это можно преобразовать в действительный путь как:

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

Я уже пытался использовать File(URI), getPath(), getFile() напрасно.

Ответы [ 7 ]

34 голосов
/ 31 декабря 2008

Это может сделать это, если 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());
3 голосов
/ 31 декабря 2008

Не уверен ни в каком точном методе, который даст вам то, что вы хотите, но это должно приблизить вас:

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]);
    }
}

Надеюсь, это поможет.

1 голос
/ 08 февраля 2012

Я просто должен был сделать это.

        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") {
            ...
1 голос
/ 21 мая 2009

Это решение будет обрабатывать пробелы в пути.

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('!'));
...
1 голос
/ 31 декабря 2008

Некоторые могут посчитать, что это немного «хакерски», но в этом случае это сработает, и я уверен, что это будет чертовски лучше, чем создание всех этих объектов в других предложениях. />

String jarUrl = "jar:file:/C:/proj/parser/jar/parser.jar!/test.xml";

jarUrl = jarUrl.substring(jarUrl.indexOf('/')+1, jarUrl.indexOf('!'));
0 голосов
/ 14 сентября 2015

Вы можете сделать это. Это работает

    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];
0 голосов
/ 21 августа 2012
  //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];
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...