Как скопировать ресурс или другой в Maven в зависимости от целевой среды? - PullRequest
33 голосов
/ 04 февраля 2009

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

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

Ответы [ 5 ]

57 голосов
/ 15 февраля 2009
  • Использовать профили Maven (http://maven.apache.org/guides/introduction/introduction-to-profiles.html)
  • Создайте профиль "dev" и "prod", выбирая альтернативный набор ресурсов для каждого профиля. Сделайте 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

10 голосов
/ 04 февраля 2009

Я решил это с помощью плагина 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>
5 голосов
/ 29 апреля 2010

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

<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>
3 голосов
/ 11 октября 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>
0 голосов
/ 10 апреля 2018

Альтернативный способ - использовать 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
...