Как скопировать ресурс в Maven в зависимости от целевой среды?

Мне нужно создать тестовую войну и производственную войну, у которых будет другой файл log4j.properties в каталоге WEB-INF. У меня есть эти файлы log4j.properties (тестовая война) и dev.log4j.properties (для производственной среды).

Как скопировать файл dev.log4j.properties в файл log4j.properties для производственной войны?


person Spring Monkey    schedule 04.02.2009    source источник


Ответы (5)


  • Используйте профили Maven (http://maven.apache.org/guides/introduction/introduction-to-profiles.html)
  • Создайте профиль «разработчик» и «продукт», выбрав альтернативный набор ресурсов для каждого профиля. Сделайте Dev активным по умолчанию.

    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/dev</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>prod</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/prod</directory>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>
    
  • Создайте с помощью желаемого профиля через: mvn install -Pdev или mvn install -Pprod

person Matthew McCullough    schedule 14.02.2009
comment
Это кажется намного элегантнее, чем то, что было у меня раньше !! - person Spring Monkey; 24.02.2009
comment
Так рада это слышать. Maven может показаться сложным, но когда его используют в соответствии с передовыми практиками, люди вроде вас говорят красиво! - person Matthew McCullough; 25.02.2009
comment
Очень полезно. Для более сложной версии вы можете добавить дополнительные каталоги ресурсов: ‹profile› ‹id› dev ‹/id› ‹activation› ‹activeByDefault› true ‹/activeByDefault› ‹/activation› ‹build› ‹resources ‹›resource› ‹каталог ›Src / main / resources / common ‹/directory› ‹/resource› ‹resource› ‹directory› src / main / resources / dev ‹/directory› ‹/resource› ‹/resources› ‹/build› ‹/profile› - person John Meagher; 04.06.2009
comment
Это лучший ответ, когда у вас есть возможность просто взять все содержимое одной из альтернатив, но бывают случаи, когда нужно начать с папки базовых ресурсов, а затем объединить переопределения. В этом случае решение Build Monkey вместе с некоторыми фильтрами в конфигурации плагина - хороший вариант. - person StevenC; 20.08.2009
comment
@StevenC: в таком случае вы можете предоставить один дополнительный каталог с общими ресурсами и настроить его в основном теге pom ‹build›. Ресурсы, заявленные в профилях, будут объединены. Для меня это идеальный ответ, поскольку он отлично работает с плагином компилятора gwt, в то время как другие решения не работают (однако эти «другие решения» работают в других случаях, без использования плагина gwt). - person omnomnom; 09.12.2011
comment
Разве не вызывает беспокойство то, что вы помещаете учетные данные в свой источник? - person monksy; 20.08.2014

Я решил это с помощью плагина maven-resources, в котором я создал каталог prod, в котором есть ресурсы для производственной среды, и скопировал их в каталог WEB-INF / classes на этапе ресурсов процесса.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-resources-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <id>copy-prod-resources</id>
            <phase>process-resources</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>webapp/WEB-INF/classes</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/resources/prod</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>
person Spring Monkey    schedule 04.02.2009

Приведенный выше код не сработал для меня - пришлось изменить его на следующий:

<plugin>
  <artifactId>maven-resources-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-prod-resources</id>
      <phase>process-resources</phase>
      <goals>
         <goal>copy-resources</goal>
      </goals>
      <configuration>
        <!-- this is important -->
        <overwrite>true</overwrite>
        <!-- this as well (target/ was missing) -->
        <outputDirectory>${basedir}/target/classes</outputDirectory>
        <resources>
          <resource>
            <directory>src/main/resources/prod</directory>
          </resource>
        </resources>
      </configuration>
    </execution>
  </executions>
</plugin>
person stephanos    schedule 29.04.2010

Последний ответ работает. Но нужно дать версию, чтобы она заработала.

<plugin>
  <artifactId>maven-resources-plugin</artifactId>
  <version>2.3</version>
  <executions>
    <execution>
      <id>copy-prod-resources</id>
      <phase>process-resources</phase>
      <goals>
         <goal>copy-resources</goal>
      </goals>
      <configuration>
        <!-- this is important -->
        <overwrite>true</overwrite>
        <!-- target -->
        <outputDirectory>${basedir}/target/classes</outputDirectory>
        <resources>
          <resource>
            <!-- source -->
            <directory>src/main/resources/prod</directory>
          </resource>
        </resources>
      </configuration>
    </execution>
  </executions>
</plugin>
person mylas    schedule 11.10.2010
comment
Я пробовал это решение, но теперь maven добавляет в классы дополнительный каталог prod. Также созданы другие мои каталоги, такие как dev и test. Что я здесь делаю не так? - person Gambo; 04.01.2012

Альтернативный способ - использовать maven-antrun-plugin

<build>
    <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.7</version>
          <executions>
            <execution>
              <phase>validate</phase>
              <goals>
                <goal>run</goal>
              </goals>
              <configuration>
                <tasks>
                  <echo>build.env: ${build.env} </echo>
                  <delete file="src/main/resources/log4j.properties" />
                  <copy file="src/env/${build.env}/log4j.properties"
                        tofile="src/main/resources/log4j.properties" />
                </tasks>
              </configuration>
            </execution>
          </executions>
        </plugin>
    </plugins>
</build>

Предположим, файлы ресурсов имеют следующую структуру:

src/
  env/
      dev/
          log4j.properties
      local/
          log4j.properties
      prod/
          log4j.properties

При сборке maven выполните следующие команды для каждой среды:

mvn package -Dbuild.env=dev
mvn package -Dbuild.env=local
mvn package -Dbuild.env=prod
person Jonathan L    schedule 10.04.2018