2017-02-17 3 views
-3

Когда я создаю проект Maven в eclipse, я вижу два вложенных каталога: src/main/java и src/main/resources. Я понимаю, что Maven предназначен для src/main/resources, который будет использоваться для файлов без кода, но возникает вопрос:Как Java различает каталоги java и ресурсов?

Как java знает, как искать в папке ресурсов, но не в папке java для произвольного поиска файлов с помощью this.getClass().getResourceAsStream("...")? Я могу поместить файл в каталог java, и он не найден. Есть ли что-то большее, чем только -classpath, используемый для указания того, где будут расположены файлы? Казалось бы, должно быть, в противном случае я мог бы помещать произвольные файлы в java или в ресурсы.

+1

Это не имеет никакого отношения к Java. Речь идет о том, как Maven строит и упаковывает проект. Посмотрите на документацию Maven, а также посмотрите на содержимое сгенерированного файла .jar. – Andreas

ответ

2

Это вопрос о том, как Maven работает, а не о том, как Java находят файлы, но я тоже расскажу об этом.

Java ClassLoader находит классы и ресурсы с помощью CLASSPATH, который для развернутого кода обычно представляет собой набор из .jar файлов. Погрузчик класса ищет файлы .jar в порядке, указанном в пути к классам, до тех пор, пока не будет найден класс/ресурс.

Установленная по умолчанию установка Maven с исходными файлами в src/main/java и src/main/resources является чисто Maven thing и не имеет ничего общего с загрузкой класса/ресурсов Java.

Во время сборки, Maven будет собирать .java исходные файлы, найденные в src/main/java, и поместить скомпилированные файлы .class в target/classes. Затем он упакует файлы .class вместе со всеми файлами, найденными в src/main/resources, в файл .jar.

В результате файл .jar содержит все файлы и файлы ресурсов .class, и именно там Java их найдет.

Обратите внимание, что файлы .java в src/main/java игнорируются процессом сборки Maven.

Если вы делаете Maven build и смотрите файлы, вы увидите все это для себя.

0

Java загружает ресурсы из «среды», во многих случаях он использует все банки в Classpath для извлечения ресурса. Загрузка ресурсов в java называется независимой от местоположения, потому что она не имеет значения, где работает ваш код, для поиска ресурсов просто нужна правильная среда.

Учитывая все банки и пути в Classpath, java будет искать относительно каждого тона, чтобы найти указанный вами ресурс. Вы указываете ресурсы, используя имена ресурсов.

ClassLoader и Класс применяются имена ресурсов по-разному

Методы в ClassLoader использовать данную строку в качестве имени ресурса без применения каких-либо абсолютное/относительное преобразование (сравни методов в классе) , Имя не должно иметь ведущего «/». Подробнее от http://www.thinkplexx.com/learn/howto/java/system/java-resource-loading-explained-absolute-and-relative-names-difference-between-classloader-and-class-resource-loading

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

Да, вы можете поместить где-либо в проекте, но вы должны внимательно прочитать структуру Maven стандартного макета каталога поместить файлы следующих правил:

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

Смежные вопросы