Почему ресурсы макета проекта отделены от источников Java? - PullRequest
17 голосов
/ 28 января 2011

Почему maven хранит ресурсы в отдельной «исходной папке» от источников Java?

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

Лично я считаю бесполезной сложность хранить файлы ресурсов отдельно от источников Java.

  1. Что вы думаете?
  2. Есть ли веская причина, по которой maven хранит ресурсы отдельно от источников?
  3. Есть ли какая-то встречная индикация в том, что вы не используете src/main/resources и src/test/resources и сохраняете ресурсы в src/main/java и src/test/java с использованием maven?

Ответы [ 8 ]

14 голосов
/ 28 января 2011

Один момент, который еще не затронут, заключается в том, что вы, очевидно, привыкли видеть проекты, в которых есть только источники Java.однако, если вы добавите некоторые другие типы исходных файлов, я думаю, что организация имеет больше смысла, например:

  • src / main
    • resources
    • java
    • groovy

каждый вложенный каталог имеет специальную классификацию файлов:

  • java -> вещи, которые скомпилированы как файлы java
  • groovy -> вещи, скомпилированные как скрипты groovy
  • resources -> некомпилированные данные, используемые для чего угодно ... (также они могут быть отфильтрованы для добавления информации времени компиляции)

также (как я уже отмечал в некоторых комментариях), я обычно не делаю каталог ресурсов плоским.файлы могут быть вложены в пакетоподобную структуру или в другие подкаталоги, в зависимости от ситуации (в моем понимании организации).

8 голосов
/ 16 февраля 2011

для простоты и удобства доступа, мы также держим некоторые ресурсы в пути к исходному коду Java.Это делает его удобным для нас при разработке на уровне GUI, поскольку шаблоны скорости близки к Java-коду контроллера.Но вы должны указать maven, чтобы он включал не Java-материал, который находится в src / main / java, добавив что-то подобное в ваш файл pom.

6 голосов
/ 15 июня 2013

Что ты думаешь? Я думаю, что парням, стоящим за Maven, следует немного «разделить интересы». Причина номер один для использования Maven - это управление зависимостями, но почему блендер должен сказать мне, как чистить фрукты? Это не имеет никакого смысла для меня.

Есть ли веская причина, по которой maven хранит ресурсы отдельно от источников? Нет. В Java-проекте дублирование структуры пакета не один, а три раза добавляет ненужную работу проекту, увеличивая риск ошибок и снижая гибкость кода.

4 голосов
/ 02 февраля 2011

Я пытаюсь дать ответ самостоятельно.

Как вы думаете?

Это бесполезная дополнительная сложность.Таким образом, это неправильно: см. Ниже.

Есть ли веская причина, по которой maven хранит ресурсы отдельно от источников?

Единственная причина, по которой я могу подумать, заключается в том, что для некоторыхПлатформа это может быть хорошей практикой.Например, в приложении Mac OSX ресурсы упакованы отдельно (в другой подпапке), чем двоичные файлы.

Я думаю, что "внешние" ресурсы и файлы конфигурации, те, которые не упакованы в финальный артефакт (файл jar), могут иметь веские основания для того, чтобы их не связывали с исходными файлами.Поэтому, когда maven упаковывает jar-файл, он знает, что эти файлы не нужно включать, потому что, например, мы хотим, чтобы они были вне jar-файла, чтобы пользователь мог редактировать эти файлы как конфигурацию.

Но для вещей, которые упакованы вместе в jar (например, строки перевода и метаданные xml, такие как отображения гибернации и конфигурация пружины), нет веских причин хранить их в отдельном месте, если только мы не ожидаем, что наши пользователи их изменят.вручную после развертывания, как часть процесса настройки.

Ресурсы могут быть организованы с той же структурой пакета, что и для классов, поэтому, если у вас есть класс в пакете xyz, вы можете захотеть иметь ресурсы, которые у него есть.зависит от одного и того же пакета, так как они представляют одну и ту же «логическую единицу»: в этом случае их размещение в двух отдельных папках требует дополнительного внимания, необходимого при рефакторинге и реорганизации пакета, так как вы хотите поддерживать синхронизацию.ClassLoader также предоставляет возможность указывать относительные пути в методе getResourceAsStream ().Поэтому, если у вас есть класс xyzMyClass, вы можете сделать getClass (). GetResourceAsStream ("foo-bar.properties"), и ресурсы будут загружены из того же пакета "xyz".Поэтому очень полезно хранить вещи вместе, когда они сильно зависимы.

Для внешних ресурсов, которые необходимо хранить отдельно, также в развертываемом артефакте, это хорошая вещь, чтобы хранить ихотдельно, но в этом случае я не понимаю, почему maven рассматривает src / main / resources как «исходную папку java» (maven-eclipse-plugin), поскольку они на самом деле не должны находиться в пути к классам, а доступ к ним осуществляется через файловую систему как простойфайлы, и особенно вы не хотите, чтобы эти файлы были включены в jar во время сборки maven.Это случай значков приложений, файлов конфигурации, которые вы, возможно, захотите поместить в каталог / etc, и т. Д.

В заключение, что-то не так в том, как maven обрабатывает ресурсы, по моему мнению: если они«внешние» ресурсы, то нет причин, по которым maven упаковывает их в конечный артефакт (jar).Если они не являются «внешними», то нет смысла хранить их в отдельной «исходной папке».

Есть ли какие-либо указания на счетчики при неиспользовании src / main / resources и src / test/ resources и хранение ресурсов в src / main / java и src / test / java с использованием maven?

Не знаю.

Большую часть времени я использовал макет по умолчанию maven для игры с ресурсами, но пару раз я этого не делал;принять меры предосторожности для объявления нестандартного расположения каталога ресурсов в pom (см. resources и super-pom ).Можно изменить структуру каталогов проекта maven, указав, что в pom:

 <build>
    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <finalName>${artifactId}-${version}</finalName>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <sourceDirectory>src/main/java</sourceDirectory>
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
      </testResource>
    </testResources>
  </build>

И я не нашел особых проблем с этим.

Я бы хотел, чтобы парни maven подумали еще разоб этом соглашении, поскольку наличие более простой структуры проекта помогает разработчику больше сосредоточиться на разработке и меньше на поиске элементов в нескольких папках в структуре проекта при просмотре кода приложения.

2 голосов
/ 28 января 2011

1) Что вы думаете?

Я думаю, это отличное соглашение.

2) Есть ли веская причина, по которой maven сохраняет ресурсыотдельно от источников?

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

3) Есть ли какие-либо противопоказания в том, чтобы не использовать src / main / resources и src / test / resources и хранить ресурсы в src /main / java и src / test / java с использованием maven?

Индикатор счетчика отсутствует.Это условно, нет ничего плохого в том, как вы организуете свой собственный код.Фактически, если вы когда-либо создавали проект Wicket, вы увидите, что ваш HTML и ваш Java-код остаются в пакете Java.Но это просто Wicket, где вы знаете, что HTML будет рядом с файлами Java.Но все остальное идет в папку resources.

2 голосов
/ 28 января 2011

Я различаю два способа: по умолчанию папки java не позволяют ничего строить в результирующем банке, кроме перечисленных типов файлов (например, *.class, *.html, *.properties, если вы используется Wicket), тогда как все данные из resources будут скопированы в сборку, за исключением нескольких исключений, которые я перечислю.

Конечно, это просто мой частный конгресс, которого я придерживаюсь.

0 голосов
/ 08 декабря 2017

Я думаю, что разделение кода / ресурсов часто полезно:

  1. Пакеты должны следовать правилам спецификации Java, например, зарезервированное слово, такое как 'int', недопустимо.Наличие недопустимых пакетов в папке с исходным кодом может привести к путанице.

  2. Ресурсы имеют природу экземпляра, классы имеют, ну, в общем, природу классов.Например, у вас могут быть классы Continent и Country в одном пакете, но ресурсы лучше организовать в виде дерева:

    • africa /
      • morocco.txt
      • kenya.txt
    • европа /
      • poland.txt
  3. структура ресурсов,на мой взгляд, более стабильна, чем структура кода.Рефакторинг кода происходит часто, классы перемещаются из пакета в пакет для лучшей читаемости.Обязательство переносить ресурсы на рефакторинг отговаривает разработчика от рефакторинга.

  4. Если отдельная папка ресурсов требуется даже только для 1% файлов ресурсов, разумно переместить оставшиеся 99% в эту папку и хранить ресурсы только в одном месте.

Однако бывают случаи, когда полезно хранить вместе ресурсы и код Java.Например, модульные тесты сравнивают ввод и вывод - неплохо иметь файл с вводом и выводом в той же папке, что и код модульного теста.

0 голосов
/ 10 августа 2012

Может быть, я здесь единственный, кто не пришел из Java. Я думаю, что смешивание ресурсов и кода очень грязно. Разделение проблем делает ваш проект чище и легче понять / поддерживать по мере роста.

Я пытаюсь применить свое собственное соглашение о каталогах ко всем моим проектам разработки программного обеспечения:

  • bin: конечные двоичные файлы, используемые пользователем
  • build: промежуточные двоичные файлы, они могут быть удалены после сборки
  • lib: внешние библиотеки
  • src: ТОЛЬКО исходный код (в данном случае исходные файлы Java)
  • ресурсы: все ресурсы (файлы конфигурации, xmls, изображения, html и т. Д.)
  • документы: документация

Редко я находил контекст разработки, когда мне нужно было изменить эту структуру каталогов.

Используя Maven, если вы хотите выполнить быструю настройку, используйте значения по умолчанию. Если вы хотите использовать свое соглашение о каталогах, вам просто нужно изменить настройки в pom.xml, как описано выше. Однако помните, что некоторые плагины Maven считают, что вы используете каталоги Maven по умолчанию для бинарных файлов ресурсов / источников / выходных данных, и вам потребуется изменить некоторые настройки плагинов, если вы измените эти каталоги.

...