#sql #maven
#sql #maven
Вопрос:
Какое рекомендуемое расположение для сценариев SQL, DDL, … в стандартной структуре каталогов Maven?
Бьюсь об заклад, почти каждый веб-проект использует базу данных и какие-то SQL-скрипты, которые нужно где-то хранить, так что, вероятно, было бы «лучшим» местом для хранения этих файлов?
Пожалуйста, посоветуйте.
Ответ №1:
Я думаю, что для этого нет наилучшей практики. В моем прошлом проекте я создал отдельный каталог для хранения такого сценария SQL.
Например src/main/db
.
По умолчанию он не будет упакован в final JAR (что в большинстве случаев является предпочтительным способом), но достаточно удобно, чтобы он был упакован в сборку. Вы даже можете упаковать их в основной файл артефакта, добавив соответствующее объявление ресурса или используя плагин maven build-helper.
Однако все зависит от вашего использования в этом скрипте. Мое простое «эмпирическое правило» заключается в том, что я бы рассмотрел возможность их размещения resources/
только тогда, когда они действительно являются ресурсами, которые должны быть загружены приложением.
Комментарии:
1. Я бы выбрал src / main / sql, аналогичный src / main / java и src / main / scala, см. maven.apache.org/pom.html#Resources
Ответ №2:
Я думаю, это полностью зависит от того, когда и как обрабатываются эти сценарии:
- Время компиляции: это то, что использует ваш компилятор / набор инструментов и создает артефакты. Руководство maven по этому вопросу очень четкое, и, следовательно, файлы будут находиться где-то в
src/main/
, напримерsrc/main/sql
илиsrc/main/db
. Хотя я бы этого не сделал, я мог видеть, что они используются задачей при компиляции для изменения вашей базы данных. Я мог видеть, что здесь используются сценарии liquibase, а затем выполняются с помощью задачи maven. - Среда выполнения: они используются вашей средой выполнения и либо изменяют ее, либо используются ею для получения результатов. Размещение их в
src/main/resources
кажется разумным, чтобы ваши процессы выполнения могли использовать их для изменения вашей базы данных по своему усмотрению — скажем, как часть вашей обработки исправлений при развертывании или как часть ваших обычных усилий по управлению версиями DB на лету. Опять же, может быть, вы отправляете liquibase со своим приложением, а затем вносите изменения в базу данных на месте таким образом… - Время разработки: мне кажется, это наиболее вероятный сценарий. Где я должен хранить свой DDL, чтобы правильно отслеживать их в VCS и при этом поддерживать свою структуру, совместимую с maven? Для меня это
src/scripts/sql
илиsrc/scripts/db
. Это помещает их как «исходные» файлы в область maven, но в место, предназначенное для использования более специальным образом.
Ответ №3:
src/main/resources
это хорошее место, но помните, что оно упаковывается в ваш конечный jar, поэтому зависит от того, хотите ли вы раскрыть это в своем производственном коде или нет.
Если нет, вы можете отфильтровать это, добавив выдержку из конфигурации maven-jar-plugin в соответствующий pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>src/main/resources/privateSubdir/**</excludes>
</configuration>
</plugin>
Комментарии:
1. «… но помните, что это упаковывается в ваш окончательный jar, поэтому зависит от того, хотите ли вы раскрыть это в своем производственном коде или нет». Именно по этой причине я не решался поместить его в каталог ресурсов. В конце концов, я интерпретировал «ресурсы» как более или менее каталог ресурсов JSF2, из которого вы можете перетаскивать свои библиотеки (ссылки на веб-страницы), поэтому сценарии SQL не совсем подходят в этом отношении.
2. @Kawu В этом случае еще лучше хранить такие материалы полностью за пределами каталогов проектов Maven — хотя я не перемещаю их для собственного удобства.
3. Полностью согласен. Обычно мы храним их в отдельной папке под src / main, поэтому нет никаких шансов, что они будут включены в продукт сборки по ошибке. Мне нравится ваша идея с фильтром, хотя @MaDa
Ответ №4:
Я бы использовал src/main/resources
для этой цели. Возможно, создание вложенной папки там.
Ответ №5:
Я разделил свое приложение на несколько проектов Eclipse, по одному для каждого архитектурного уровня. Это включает в себя базу данных. По сути, я создал новый тип упаковки «database» только для этого проекта. Я создал папку src / main / sql, и в нее вместо пакетов Java я поместил схемы баз данных (например, src / main / sql / security). Я полагаю, что если вы используете каталоги, сначала это будут каталоги, а затем под ними схемы. В каждой из папок схемы я помещаю папку для каждого типа объекта базы данных (таблица, представление и т.д.), Чтобы в итоге получить, например, src / main / sql / security / tables, а затем помещаю туда все файлы определения таблицы для этой схемы. Мне интересно прочитать любые мнения о том, как это сделать таким образом.
Ответ №6:
Это очень сильно зависит от вашего пробега, но, прежде всего, неплохо отделить ваше приложение от базовой структуры базы данных. Поэтому я рекомендую вам перенести все материалы, связанные с базой данных, в отдельный проект maven. После этого скрипты базы данных имеют хороший слот в /src / main / scripts.