Вопрос по java, configuration, maven, war, deployment – Указание параметров конфигурации времени выполнения для встроенного веб-приложения Maven

1

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

Под этим я подразумеваю следующее. С помощью Ant я обычно создаю папку (например,config-params) и в эту папку я помещаю некоторые файлы свойств или любые другие необходимые файлы с правильными настройками для сред, в которых будет работать мое приложение.

Например:

- test.jdbc.properties
- cert.jdbc.properties
- prod.jdbc.properties
- test.log4j.properties
- test.myapplication.properties
- test.web.xml

... ad nauseum

Затем в моем скрипте сборки Ant я просто прочитал переменную конфигурации профиля изproject.properties файл, который просто указывает набор файлов, которые я хотел бы использовать (test, cert или жеprod).

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

Итак, два вопроса:

Is this possible to achieve with a Maven POM in a non hackish way? Is there a piece of Maven documentation, book or reference which deals with this stage of an application build?

Is there a more sensible way to target my application build profile towards a specific execution evironment (test, prod, etc)? I guess this one might be more open to debate but if there's a simpler, more elegant way of dealing with this, I'm all ears :P.

Я благодарю вас за любую помощь, которую вы можете оказать. Ура!

Ваш Ответ

2   ответа
1

Первым делом я бы предложил поместить вашу конфигурацию для тестовой среды в src / test / resources, которая может использоваться для тестирования автоматически Maven. Производственная конфигурация должна быть расположена в src / main / resources, что означает, что производственная конфигурация будет автоматически использоваться во время упаковки и выпуска. Другой целевой объект конфигурации, такой как cert, означает, что вам нужно во второй раз создать приложение для другой среды.

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

.
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |-- resources
    |   |-- environment
    |   |   |-- test
    |   |   |   `-- database.properties
    |   |   |-- qa
    |   |   |   `-- database.properties
    |   |   `-- production
    |   |       `-- database.properties
    |   `-- webapp

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

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

  <id>test</id>
  <formats>
    <format>war</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <useProjectArtifact>true</useProjectArtifact>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <outputDirectory>WEB-INF</outputDirectory>
      <directory>${basedir}/src/main/environment/test/</directory>
      <includes>
        <include>**</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

И, конечно, конфигурация для maven-assembly-plugin такая:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <id>test</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/test.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
      <execution>
        <id>qa</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/qa.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
      <execution>
        <id>production</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/production.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin>

В результате получается только одна сборка, которая создает один артефакт для каждой среды, например:

artifactId-version-test.war

artifactId-version-qa.war

artifactId-version-production.war

Ну, похоже, это имеет смысл и может сработать. Спасибо! Jesús Zazueta
Описание здесь:blog.soebes.de/index.php?/archives/…
0

Прочитать оMaven строить профили.

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

mvn -P <profile-name> <targets>

Вы также можете позволить maven решить, какой профиль использовать, определив<activation/> правила.

Я посмотрю. Спасибо! Jesús Zazueta

Похожие вопросы