web-dev-qa-db-fra.com

Comment copier une ressource ou une autre dans Maven en fonction de l'environnement cible?

Je dois créer une guerre de test et une guerre de production, qui auront un fichier log4j.properties différent dans le répertoire WEB-INF. J'ai ces fichiers log4j.properties (test war) et dev.log4j.properties (pour la production enivorment).

Comment copier le fichier dev.log4j.properties dans le fichier log4j.properties pour la guerre de production?

33
Spring Monkey
  • Utiliser les profils Maven ( http://maven.Apache.org/guides/introduction/introduction-to-profiles.html )
  • Créez un profil "dev" et "prod" en sélectionnant un autre ensemble de ressources pour chaque profil. Activer Dev par défaut.

    <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>
    
  • Construire en utilisant le profil souhaité via: mvn install -Pdev Ou mvn install -Pprod

56
Matthew McCullough

J'ai résolu ce problème en utilisant le plugin maven-resources, où j'ai créé le répertoire prod qui contient les ressources pour l'environnement de production et les ai copiées dans le répertoire WEB-INF/classes lors de la phase processus-ressources.

<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>
9
Spring Monkey

Le code ci-dessus n'a pas fonctionné pour moi. J'ai dû le modifier comme suit:

<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>
5
stephanos

La dernière réponse fonctionne… .. Mais vous devez donner la version pour que cela fonctionne.

<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>
3
mylas

La méthode alternative consiste à utiliser 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>

Supposons que les fichiers de ressources sont dans la structure suivante:

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

Lorsque maven est créé, exécutez les commandes suivantes par environnement:

mvn package -Dbuild.env=dev
mvn package -Dbuild.env=local
mvn package -Dbuild.env=prod
0
Jonathan L