Какое рекомендуемое расположение для сценариев SQL (DDL)?

#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:

Я думаю, это полностью зависит от того, когда и как обрабатываются эти сценарии:

  1. Время компиляции: это то, что использует ваш компилятор / набор инструментов и создает артефакты. Руководство maven по этому вопросу очень четкое, и, следовательно, файлы будут находиться где-то в src/main/ , например src/main/sql или src/main/db . Хотя я бы этого не сделал, я мог видеть, что они используются задачей при компиляции для изменения вашей базы данных. Я мог видеть, что здесь используются сценарии liquibase, а затем выполняются с помощью задачи maven.
  2. Среда выполнения: они используются вашей средой выполнения и либо изменяют ее, либо используются ею для получения результатов. Размещение их в src/main/resources кажется разумным, чтобы ваши процессы выполнения могли использовать их для изменения вашей базы данных по своему усмотрению — скажем, как часть вашей обработки исправлений при развертывании или как часть ваших обычных усилий по управлению версиями DB на лету. Опять же, может быть, вы отправляете liquibase со своим приложением, а затем вносите изменения в базу данных на месте таким образом…
  3. Время разработки: мне кажется, это наиболее вероятный сценарий. Где я должен хранить свой 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.