Как получить путь к ресурсу в файле JAR Java - PullRequest
151 голосов
/ 03 июня 2009

Я пытаюсь найти путь к ресурсу, но мне не повезло.

Это работает (как в IDE, так и с JAR), но таким образом я не могу получить путь к файлу, только содержимое файла:

ClassLoader classLoader = getClass().getClassLoader();
PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));

Если я сделаю это:

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("config/netclient.p").getFile());

Результат: java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)

Есть ли способ получить путь к файлу ресурса?

Ответы [ 16 ]

1 голос
/ 20 октября 2017

В вашей папке ресурсов (java / main / resources) вашего jar добавьте свой файл (мы предполагаем, что вы добавили XML-файл с именем import.xml ), после этого Вы вводите ResourceLoader, если используете пружину, как показано ниже

@Autowired
private ResourceLoader resourceLoader;

функция внутреннего тура, введите ниже код для загрузки файла:

    Resource resource = resourceLoader.getResource("classpath:imports.xml");
    try{
        File file;
        file = resource.getFile();//will load the file
...
    }catch(IOException e){e.printStackTrace();}
1 голос
/ 14 апреля 2014
private static final String FILE_LOCATION = "com/input/file/somefile.txt";

//Method Body


InputStream invalidCharacterInputStream = URLClassLoader.getSystemResourceAsStream(FILE_LOCATION);

Получение этого от getSystemResourceAsStream - лучший вариант. Получая входной поток, а не файл или URL-адрес, он работает в JAR-файле и как отдельный.

1 голос
/ 21 июля 2012

У меня работал следующий путь: classpath:/path/to/resource/in/jar

0 голосов
/ 11 января 2019

Может быть, этот метод можно использовать для быстрого решения.

public static String getResourcePath(String relativePath)
{
    String pathStr = null;
    URL location = <Class>.class.getProtectionDomain().getCodeSource().getLocation();
    String codeLoaction = location.toString();
    try{
        if (codeLocation.endsWith(".jar"){
            //Call from jar
            Path path = Paths.get(location.toURI()).resolve("../classes/" + relativePath).normalize();
            pathStr = path.toString();
        }else{
            //Call from IDE
            pathStr = <Class>.class.getClassLoader().getResource(relativePath).getPath();
        }
    }catch(URISyntaxException ex){
        ex.printStackTrace();
    }
    return pathStr;
}
0 голосов
/ 16 февраля 2014

В jar-файле ресурс расположен абсолютно в иерархии пакетов (не в иерархии файловой системы). Поэтому, если у вас есть класс com.example.Sweet, загружающий ресурс с именем «./default.conf», тогда имя ресурса указывается как «/com/example/default.conf».

Но если это в банке, то это не файл ...

0 голосов
/ 22 мая 2012

Как уже было сказано, это не оптимальный способ загрузки ресурсов, но если вам абсолютно необходимо иметь ссылку java.io.File, попробуйте следующее:

 URL url = null;
  try {
     URL baseUrl = YourClass.class.getResource(".");
     if (baseUrl != null) {
        url = new URL(baseUrl, "yourfilename.ext");
     } else {
        url = YourClass.class.getResource("yourfilename.ext");
     }
  } catch (MalformedURLException e) {
     // Do something appropriate
  }

Это дает вам java.net.URL и может использоваться в конструкторе java.io.File.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...