Подтвердить что ты не робот

Использование Maven для множественной среды развертывания (производство/разработка)

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

В настоящее время я создаю Ant script для создания разных военных файлов - один для производства и один для разработки, используя следующие команды:

ant deploy-dev
ant deploy-prod
ant deploy-sit
ant deploy-uat

Таким образом, в основном они создают военный файл, а затем обновляют военный файл, подключая файл свойств

Есть ли что-то подобное в maven (другая война создана в зависимости от конфигурации)?

если да, как это сделать?

Я попробовал mvn war, но он просто создает войну

4b9b3361

Ответ 1

Лучшая практика FYI состоит в том, чтобы не перестраивать ваш артефакт для разных сред, поскольку это не приводит к восстановлению сборных конструкций, и другие вещи могут потенциально измениться при перестройке. То есть используя фильтрацию ресурсов, как было предложено выше, работает только при перестройке вашего проекта.

Когда вы заканчиваете артефакт от разработчика до теста или приемочного теста на производство - вы не хотите перестраивать.

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

db-dev.properties
db-test.properties
db-prod.properties

Затем вы можете переключаться между этими конфигурациями с помощью переменных времени выполнения и spring PropertyPlaceholderConfigurer.

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

Я также предлагаю оставить настройку "по умолчанию" как производство - чтобы при развертывании на производство вам не нужно беспокоиться, если вы забыли установить переменную среды.

Ответ 2

Я предпочитаю использовать профили maven для этой ситуации. Например, у нас есть структура каталогов:

src/main/resources
|
+- local
|  |
|  `- specific.properties
+- dev
   |
   `- specific.properties

В pom.xml определите два профиля:

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/local</directory>
                </resource>
            </resources>
        </build>
    </profile>
    <profile>
        <id>dev</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/dev</directory>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>

В этом случае мне не нужно обновлять каждый раз pom.xml для новых файлов. В IDE просто переключайте профили или используйте флаг -P из командной строки.

UPD: что делать, если некоторые свойства одинаковы для конфигураций? Сделайте конфигурацию следующим образом:

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
                <resource>
                    <directory>src/main/config/local</directory>
                </resource>
            </resources>
        </build>
    </profile>
    <profile>
        <id>dev</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
                <resource>
                    <directory>src/main/config/dev</directory>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>

Общая часть будет сохранена в src/main/resources, а другие конфиги будут в соответствующих папках в каталоге конфигурации.

Ответ 3

Если вы хотите удалить ant из своего процесса, я бы посмотрел на использование профилей сборки с фильтрами.

В этом случае подключите свои файлы свойств в древовидную структуру src/main/resources. Затем параметризуйте файл свойств с такими свойствами фильтра, как это:

jdbc.url=${filtered.jdbc.property}

Затем внутри src/main/filters создаются файлы фильтров на основе профилей. поэтому у вас могут быть dev-filters.properties sit-filters.properties и т.д. Они содержат:

filtered.jdbc.property=jdbc url here

Затем вы настраиваете профили сборки для каждого региона, где вы устанавливаете свойство env, указывающее на конкретный регион вашего здания. Затем вы можете настроить фильтр ресурсов для использования ${env}-filters.properties для каждой сборки. Кроме того, вы можете настроить военный плагин, чтобы добавить свойство env к вашему артефакту, чтобы вы фактически хранили 4 разных артефакта в вашем репозитории под другим классификатором.

Затем вы просто создаете приложение с каждым профилем. Вы должны вызвать сборку для каждого профиля, но она работает хорошо.

Пример некоторых настроек в POM:

<build>
  <filters>
    <filter>src/main/filters/filter-${env}-application.properties</filter>
  </filters>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  <plugins>
    <plugin>
      <artifactId>maven-war-plugin</artifactId>
      <version>2.1-beta-1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>war</goal>
          </goals>
          <configuration>
            <classifier>${env}</classifier>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

<profiles>
  <profile>
    <id>LOCAL</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <env>LOCAL</env>
    </properties>
  </profile>
  <profile>
    <id>DEV</id>
    <properties>
      <env>DEV</env>
    </properties>
  </profile>
  <profile>
    <id>UAT</id>
    <properties>
      <env>UAT</env>
    </properties>
  </profile>
  <profile>
    <id>PROD</id>
    <properties>
      <env>PROD</env>
    </properties>
  </profile>
</profiles>

Кроме того, реквизиты этого сообщения в блоге, в котором я изначально нашел шаги, чтобы выполнить это.

Ответ 4

Я обработал это с помощью Spring PropertyPlaceholderConfigurer и включил файлы свойств в pathpath и один в файловой системе:

<context:property-placeholder 
    location="classpath*:META-INF/spring/*.properties,file:myapp*.properties"/>

Если в текущем каталоге есть файл myapp *.properties, когда приложение запускается (или запускаются тесты и т.д.), он переопределяет свойства из файлов, запеченных в war/ear/whatever.

Ответ 5

Здесь эта статья об этом на maven 2, используя строить профили. Похоже, что он просто делегирует ant в любом случае через плагин antrun, поэтому вы даже можете уйти с повторным использованием существующих файлов build.xml.