web-dev-qa-db-fra.com

Le filtrage des ressources Web avec le plug-in Maven war ne fonctionne pas dans Eclipse avec m2e

J'essaie de filtrer un fichier de configuration Spring à l'aide du filtrage Maven. Mon POM est configuré comme ceci:

        ...
        <plugin>
          <groupId>org.Apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <webResources>
              <resource>
                <filtering>true</filtering>
                <targetPath>WEB-INF/context</targetPath>
                <directory>src/main/webapp/WEB-INF/context</directory>
                <includes>
                  <include>applicationContext.xml</include>
                </includes>
              </resource>
            </webResources>
          </configuration>
        </plugin>
        ...

et

  <profiles>
    <profile>
        <id>desarrollo</id>
         <activation>
          <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <filters>
              <filter>src/main/properties/dev.properties</filter>
            </filters>
      </build>
    </profile>
    <profile>
        <id>pruebas</id>
        <build>
            <filters>
              <filter>src/main/properties/test.properties</filter>
            </filters>
      </build>
    </profile>
            ...

Cela fonctionne très bien lorsque vous invoquez Maven directement. 

Malheureusement, lors du déploiement à chaud de l'application Web dans Tomcat 6 avec Eclipse WTP et m2e, il sélectionne toujours la version non filtrée de applicationContext.xml. (Le fichier applicationContext.xml du dossier target/m2e-wtp/web-resources/WEB-INF/context n'est jamais filtré)

Je ne trouve pas de documentation utile sur le sujet. Je ne suis même pas sûr s'il est implémenté dans M2E.

Quelque chose ne va pas dans ma configuration ou s'agit-il d'une fonctionnalité non implémentée?

22
Juan Calero

Enfin, je l'ai enfin.

Tout d’abord, j’ai fait ce que khmarbaise a souligné. J'ai déplacé applicationContext.xml dans le dossier des ressources. Les plug-in war webResources sont conçus pour fonctionner avec des ressources externes, et filtrer un fichier dans le dossier de destination n'était pas la meilleure pratique .

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

et 

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <webResources>
                    <resource>
                        <filtering>true</filtering>
                        <targetPath>WEB-INF/context</targetPath>
                        <directory>src/main/resources/WEB-INF/context</directory>
                        <includes>
                            <include>applicationContext.xml</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>

Donc, la moitié du crédit pour lui… .. Mais cela ne suffisait pas, cela ne fonctionnait toujours pas. J'ai réalisé que Maven/m2e était en train de filtrer mon fichier, mais il n'avait pas mes fichiers de propriétés définis. Après quelques tests, j'ai découvert que m2e ignorait l'option activeByDefaultdans la section d'activation des profils.

J'ai donc ajouté mon profil par défaut à la configuration du projet Maven, puis cela a fonctionné.

enter image description here

26
Juan Calero

J'ai eu un problème similaire avec le filtrage du web.xml. J'ai résolu le problème en réimportant l'ensemble du projet dans Eclipse.

La raison en était un fichier /.settings/org.Eclipse.wst.common.component corrompu. Dans ce fichier, l'ordre des fichiers copiés dans le répertoire de déploiement des serveurs Web locaux est défini. Par exemple:

<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
  <wb-module deploy-name="liquidvote-rest">
    <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
    <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/Java"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
    <property name="context-root" value="myapp"/>
    <property name="Java-output-path" value="/myapp/target/classes"/>
  </wb-module>
</project-modules>

Si le fichier web.xml ou application.xml existe dans plusieurs répertoires, il sera pris dans le premier répertoire trouvé. Il est donc important que

    <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>

est la première entrée.

Vous trouverez plus d'informations sur http://wiki.Eclipse.org/M2E-WTP_FAQ dans la section "Qu'est-ce que ce dossier de ressources Web?"

7
insideout

Avez-vous essayé de placer les ressources sous src/main/resources/WEB-INF/... au lieu de et configuré la zone de ressources pour filtrer les ressources au lieu de placer la configuration dans un emplacement Maven autre que celui par défaut.

1
khmarbaise

Aujourd'hui, j'ai eu le même problème lorsque plusieurs bocaux ont été inclus dans la guerre. J'ai activé le filtrage et comparé les pots originaux avec les filtres. Ils semblent être les mêmes, mais ce n'est pas vrai. J'ai essayé de renommer le fichier jar en Zip et je n'ai pas pu décompresser le contenu en raison d'une structure corrompue dans le fichier jar (Zip), alors que le fichier d'origine était correct. Il est également mentionné ici en ajoutant des ressources Web de filtrage où il est indiqué que le filtrage doit être défini sur false afin d’empêcher la corruption de vos fichiers binaires.

0
Michal

Je viens d'avoir un problème similaire. Ma solution n'est pas élégante et je n'en suis pas fière, mais disons qu'elle est acceptable. Dans mon cas, j'ai une application de démarrage à ressort mvc avec l'application swagger (pour permettre aux testeurs de tester notre API). Le fait est que nous utilisons cette application dans deux environnements. J'ai donc créé deux profils - dev et test. Dans dev env, nous aimerions lancer l'application d'Eclipse uniquement avec "run as", le chemin du contexte est donc vide (je sais qu'il peut être défini dans la configuration Java au printemps, mais ce n'est pas le seul espace réservé que nous aimerions passer) et test env l'application est exécutée dans notre version personnalisée de Tomcat ... le chemin du contexte est donc identique à celui du nom de fichier war.

et voici le problème - swagger appelle les documents de repos sur ce chemin de contexte et cela dépend du profil Spring. Nous avons donc une ressource Web à filtrer. Au début, j'ai essayé d'utiliser le filtrage m2e-wtp:

...
<build>
<plugins>
<plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/scripts.js</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
...

il fonctionnait mais ne fonctionnait que de manière intégrée dans Eclipse Tomcat ou depuis la ligne de commande Java -jar, il ne fonctionnait pas avec "run as" de Eclipse.

La ressource a été filtrée et je les ai vues dans web-resource dans target, mais Eclipse semble fonctionner directement sur un code source ou est en train de copier, je ne sais pas ... il ne peut pas voir les ressources filtrées ... alors je pensais que Je vais faire quelque chose comme ça:

<resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources/webapp/swagger</directory>
                <targetPath>${basedir}/src/main/webapp/swagger</targetPath>
                <includes>
                    <include>scripts.js</include>
                </includes>
            </resource>
        </resources>

Ce n'est pas la solution la plus chanceuse, car il s'agit de modifier le code et non la cible, mais au moins, cela fonctionne. Si quelqu'un avait des suggestions pour le faire fonctionner sans modifications du code, je vous en serais reconnaissant.

0
Piotr Tempes

J'ai essayé tout ce qui est décrit ci-dessus sans succès. Les fichiers ont été filtrés et générés correctement dans le dossier "m2e-wtp", mais pour une raison quelconque, Eclipse copiait des fichiers à partir de "cible/classes". 

Ainsi, j'ai changé mon fichier pom.xml en changeant le dossier de destination de "m2e-wtp" à "cible/classes", comme le code à venir. 

Important: chaque fois que vous devez exécuter une construction Maven sur un projet, vous devez modifier le pom afin de générer un projet.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>  
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <filters>
            <filter>${project.basedir}/src/main/filters/${build.profile.id}/config.properties</filter>
        </filters>
        <webResources>
            <resource>
                <filtering>true</filtering>
                <directory>${project.basedir}/src/main/resources</directory>
                <targetPath>${project.basedir}/target/classes</targetPath>
                <includes>
                    <include>*.properties</include>
                    <include>*.xml</include>
                    <include>META-INF/spring/*.xml</include>
                </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>