У меня есть библиотека, которая используется программой. Эта библиотека загружает специальный каталог в папку ресурсов.
в библиотеке у меня есть метод
public class DataRegistry{
public static File getSpecialDirectory(){
String resourceName = Thread.currentThread().getContextClassLoader().getResource("data").getFile().replace("%20", " ");
File file = new File(resourceName);
return file;
}
}
в моей программе у меня есть основной метод
public static void main(String args[]){
System.out.println(Data.getSpecialDirectory());
}
Когда я запускаю getSpecialDirectory() в тесте junit в программе данных, ресурс извлекается, и все хорошо.
Когда я запускаю getSpecialDirectory() в основном методе вне программы данных (импортированный jar), я получаю каталог данных jars, а не каталог, который ожидает программа, выполняющая поток.
Я решил, что загрузчик родительского класса решил бы эту проблему... Я считаю, что у меня может быть фундаментальная проблема в моем понимании здесь.
Для ясности:
(библиотека) Строка 15 этого файла: https://gist.github.com/AnthonyClink/11275442
(Использование) Линия 31 этого файла: https://gist.github.com/AnthonyClink/11275661
Мои поры могут иметь к этому какое-то отношение, поэтому обмен ими, вероятно, важен:\
(Библиотека) https://github.com/Clinkworks/Neptical/blob/master/pom.xml
(Использование) https://github.com/Clinkworks/Neptical-Maven-Plugin/blob/master/pom.xml
Вам нужен каталог, из которого была загружена программа Java? Можешь попытаться
Файл f = новый файл ("."). GetCanconicalFile();
Или, если вы хотите, чтобы все места могли попробовать разобрать путь класса из System.env или использовать загрузчик классов по умолчанию
Если вам нужна директория относительно баночки, из которой были загружены ваши классы: Цитата из http://www.nakov.com/blog/2008/06/11/finding-the-directory-where-your-java-class- файлы будут загружены, с /
URL classesRootDir = getClass(). GetProtectionDomain(). GetCodeSource(). GetLocation();
Приведенное выше возвращает базовый каталог, используемый при загрузке ваших.class файлов. Он не содержит пакет. Он содержит только каталог классов. Например, в консольном приложении приведенное выше значение выглядит следующим образом:
Файл: /C: /Documents %20and %20Settings/Администратор/рабочее пространство /TestPrj/bin/
В веб-приложении он возвращает следующее:
Файл: /C: /Tomcat/WebApps/MyApp/WEB-INF/классы/
FYI Это может быть применимо, если запущенная программа идентификатора пользователя не может читать все папки: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getProtectionDomain%28%29
Если вам нужно только прочитать содержимое ресурса, вы должны использовать java.lang.ClassLoader.getResourceAsStream(...) и прочитать содержимое.
Обратите внимание, что обновление содержимого ресурсов загрузчика классов невозможно.
Насколько я знаю, нет никакой гарантии, что у вас есть каталог для ваших ресурсов. Java предоставляет методы для получения ресурса в качестве InputStream, но ничего, что может легко получить файл для ресурса, хотя можно получить URL-адрес для данного ресурса.
Если вам нужен специальный рабочий каталог в вашем приложении, я рекомендую передать его как системное свойство, параметр программы, параметр веб-приложения или что-то еще, что позволяет узнать, где находятся ваши файлы приложений. Вы даже можете заполнить этот каталог ZIP файлом, который вы укажете в качестве ресурса в своем приложении, поскольку библиотеки ZIP в Java действительно принимают входные потоки в качестве параметров.
Хотя пользователь @tgkprog прав, и его ответ правильный, я едва ли могу представить, что вы действительно хотите, что вы, кажется, попросили и что он правильно ответил в (3). Измените свой вопрос и объясните
resourceName
будет напечатано на консоли,В противном случае я боюсь, что нет хорошего способа ответить на вопрос.