2016-10-10 3 views
0

Я хочу получить доступ к форме ресурса моего проекта «\ src \ main \ resources», но по какой-либо причине я могу получить доступ только к целевым классам. Вот мой код:Не удается получить доступ к пути ресурса, только целевой путь

System.out.println(Main.class.getResourceAsStream("/123.txt")); // [email protected] 
System.out.println(Main.class.getResource("/123.txt")); // file:/C:/Users/Raul/workspace/Serial/target/classes/123.txt 
System.out.println(Thread.currentThread().getContextClassLoader().getResource("123.txt").getPath()); // /C:/Users/Raul/workspace/Serial/target/classes/123.txt 

и вот мой проект Dirs:

project dirs

Дело в том, даже если удалить все файлы в целевых/классов и запустить код, то компилятор скопирует файлы из «src/main/ressources» в «target/classes» и прочитает их оттуда.

ответ

0

Я хочу получить доступ к форме ресурса моего проекта «\ src \ main \ resources», но по какой-либо причине я могу получить доступ только к целевым классам.

На мой взгляд, на вопрос отвечает @VGR. Просто чтобы прояснить его в других словах:

  • Вы помещаете свои ресурсы в папке /src/main/resources, и эти ресы будут скопированы как в /target/classes папку, когда вы строите свой проект.

Пример

src/main/resouces/123.txt -> target/classes/123.txt 
src/main/resources/myresources/145.txt -> target/classes/myresources/145.txt 
... 

Теперь, если вы запустите программу внутри вашего IDE вы будете соблюдать следующие правила:

System.out.println(Main.class.getResource("/123.txt")); 

выход: файл:/C:/Users/Raul/рабочее пространство/Серийный/целевой/класс/123.txt

System.out.println(Main.class.getResource("/myresources/145.txt")); 

Выход: файл:/C:/Пользователи/Raul/workspace/Serial/target/classes/myresources/145.TXT

Но если открыть сгенерированный jar файл, который вы не увидите папку target, поскольку файл 123.txt будет на корне jar файла и 145.txt будет в папке myresources/145.txt.

Цель папки - это только выходной каталог для инструмента построения и не будет упакован в файл jar.

Теперь следующий вопрос:

проблема заключается в том, что я не знаю, как экспортировать целевые классы в моем банке, или как я могу получить «SRC/основные/RESSOURCES» в качестве возвращаемого значения.

Чтобы ответить на этот вопрос, вы должны заглянуть в свой файл pom.xml в корень вашего проекта. В нем должна быть запись <packaging>jar</packaging>. Если это так, вы создаете файл банки следующим образом:

Вариант 1: из командной строки

mvn clean install 

файл банк будет создан и скопирован в папку target.

Вариант 2: внутри Eclipse, (например)

right click on the pom.xml > Run AS > Maven install 

файл банка также должен быть сформирован и скопирован в папку target.

Примечание: на скриншоте есть два файла jar: core-0.0.1-SNAPSHOT.jar и Serial-0.0.1-SNAPSHOT.jar; удалите их (mvn clean или щелкните правой кнопкой мыши> Запустить AS> Maven clean) перед созданием файла jar. Причина в том, что Maven может генерировать только один файл jar для модуля/проекта Maven, afaik.

+0

THX за помощь –

0

Вы видите предполагаемое поведение. Программа Java скомпилировала в исполняемые файлы формы и ресурсов. Когда другие пользователи запускают вашу программу, у них не будет доступа к источнику, поэтому ваш код не должен предполагать, что ваше исходное дерево будет доступно.

Проще говоря, ваш код верный как есть. Не пытайтесь читать исходное дерево. Если вы хотите, чтобы цель/классы содержали обновленные файлы, перестройте свой проект.

Предупреждение: Никогда не используйте метод URL-адреса getPath() для преобразования URL-адреса в имя файла. Существует много символов, которые не разрешены в URL-адресах, и эти символы будут «процентными экранами», чтобы соответствовать спецификации URL-адреса; в результате, часть пути URL-адреса не является файловым именем vaid! Единственным правильным способом преобразования URL-адреса в файл является Paths.get (url.toURI()). Тем не менее, вы даже не должны пытаться преобразовать ресурс в файл, потому что как только вы перейдете к упаковке ваших программ в .jar-файлах, ваши ресурсы не будут существовать как обычные файлы вообще, только как записи в .jar-файлах (которые на самом деле являются только zip-файлами с добавлением некоторых добавленных Java-записей).

+0

но после того, как я экспортирую свой projct в файл jar и загляну, в папку ressource есть и все мои ressourcesc. То, что мне нужно, - это решение для исправления пути ressource. thx –

+0

Если 'Main.class.getResource ("/123.txt ")' уже возвращает действительный объект, в чем проблема? – VGR

+0

проблема в том, что я не знаю, как экспортировать целевые классы в мою банку, или как я могу получить «src/main/ressources» в качестве возвращаемого значения. –