Maven: personnaliser le web.xml du projet web-app

J'ai un projet Maven d'application web, et je veux personnaliser le web.fichier xml en fonction du profil en cours d'exécution. J'utilise le plugin Maven-War, qui me permet de définir un répertoire "resources", où les fichiers peuvent être filtrés. Cependant, le filtrage seul n'est pas suffisant pour moi.

Plus en détail, je veux inclure (ou exclure) toute la section sur la sécurité, en fonction du profil en cours d'exécution. C'est la partie:

....
....

<security-constraint>

    <web-resource-collection>
        <web-resource-name>protected</web-resource-name>
        <url-pattern>/pages/*.xhtml</url-pattern>
        <url-pattern>/pages/*.jsp</url-pattern>
    </web-resource-collection>

    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>

    </security-constraint>
        <login-config>
        <auth-method>${web.modules.auth.type}</auth-method>
        <realm-name>MyRealm</realm-name>
    </login-config>

<security-constraint>

....
....

Si cela n'est pas fait facilement, est-il possible d'avoir deux web.fichiers xml et sélectionnez celui qui convient en fonction du profil?

49
demandé sur Bart 2010-07-21 15:36:43

7 réponses

Est-il un moyen d'avoir deux web.fichiers xml et sélectionnez celui qui convient en fonction du profil?

Oui, dans chaque profil, vous pouvez ajouter une configuration de maven-war-plugin et configurez chacun pour pointer sur un web.xml différent.

<profiles>
    <profile>
        <id>profile1</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <webXml>/path/to/webXml1</webXml>
                    </configuration>
                </plugin>
                 ...

Comme alternative à la nécessité de spécifier maven-war-plugin configuration dans chaque profil, vous pouvez fournir une configuration par défaut dans la section principale du POM, puis la remplacer pour des raisons spécifiques profil.

Ou pour être encore plus simple, dans le principal <build><plugins> de votre POM, utilisez une propriété pour faire référence à l'attribut webXml, puis changez simplement sa valeur dans différents profils

<properties>
    <webXmlPath>path/to/default/webXml</webXmlPath>
</properties>
<profiles>
    <profile>
        <id>profile1</id>
        <properties>
            <webXmlPath>path/to/custom/webXml</webXmlPath>
        </properties>
    </profile>
</profiles>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webXml>${webXmlPath}</webXml>
            </configuration>
        </plugin>
        ...
67
répondu matt b 2013-05-20 14:37:36

Il y a une troisième option de compromis que j'ai implémentée dans mon projet. Il garde tout dans un seul web.xml tout en le faisant à la fois et le pom.XML lisible. Dans mon cas, j'avais parfois besoin d'avoir de la sécurité et parfois pas de sécurité, selon l'environnement.

Donc ce que j'ai fait était:

Dans le pom.xml, définissez deux profils (ou autant que vous en avez besoin). Dans les profils, incluez deux propriétés. Quand vous voulez la sécurité, vous les laissez vides, comme ce:

<enable.security.start></enable.security.start>
<enable.security.end></enable.security.end>

Lorsque vous voulez exclure toute la sécurité, vous les définissez comme suit:

<enable.security.start>&lt;!--</enable.security.start>
<enable.security.end>--&gt;</enable.security.end>

Ensuite, vous avez une seule toile.fichier xml avec les éléments suivants:

${enable.security.start}
<security-constraint>
  ...
  // all of the XML that you need, in a completely readable format
  ...
</login-config>  
${enable.security.end}

Le pom.xml maven-guerre-plugin doit être configuré pour utiliser le filtrage. Le mien ressemble à ceci:

   <configuration>
      <webResources>
        <resource>
          <filtering>true</filtering>
          <directory>src/main/webapp</directory>
          <includes>
            <include>**/web.xml</include>
          </includes>
        </resource>
      </webResources>
      <warSourceDirectory>src/main/webapp</warSourceDirectory>
      <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
      ...

Donc, fondamentalement, lorsque vous sélectionnez le profil pour inclure la sécurité, vous obtenez deux CRLF supplémentaires dans votre web.XML. Lorsque vous sélectionnez le profil pour ne pas inclure la sécurité, le XML est toujours dans le web.XML, mais il est commenté donc il est ignoré. J'aime cela parce que vous n'avez pas à vous soucier de garder plusieurs fichiers synchronisés, mais le XML est toujours lisible (et c'est sur le web.fichier xml où les gens le chercheraient naturellement).

44
répondu Chris Clark 2011-12-21 16:26:50

Commentaire à Chris Clark Réponse. Vous pouvez inverser-donc dans le développement, vous ne voulez pas avoir de contraintes (sécurité ou jndi, autre)

<!-- ${enable.security.end}
<security-constraint>
    ...
</security-constraint>


${enable.security.start} -->

Donc, dans le développement, vous avez commenté la section. Mais en production, il sera traduit en (avec le profil maven):

<!-- -->
<security-constraint>
    ...
</security-constraint>


<!-- -->

Et la section commentée sera visible.

18
répondu Andrzej Jozwik 2017-05-23 11:47:17

"matt b" a déjà posté la réponse qui est la façon la plus maven de le faire. C'est la façon dont je recommande de le faire 99% du temps.

Cependant, parfois, votre fichier de configuration peut être assez compliqué, et cela n'a pas beaucoup de sens de dupliquer le fichier entier pour chaque environnement quand une seule strophe XML diffère. Dans ces cas, vous pouvez abuser du filtrage de propriété pour atteindre votre objectif.

Attention, une solution très duct-tape-y suit, et ne sera pas pour le faible de cœur:

Dans votre pom.xml:

Attention Aux Éditeurs De StackOverflow!!!!

L'entité html qui s'échappe fait partie de la solution. La solution Ne fonctionne pas si vous remplacez tout cela par des signes plus grands que et moins que. Veuillez laisser la réponse telle quelle...

<properties>
    <test.security.config>
        &lt;security-constraint&gt;
            &lt;web-resource-collection&gt;
                &lt;web-resource-name&gt;protected&lt;/web-resource-name&gt;
                &lt;url-pattern&gt;/pages/*.xhtml&lt;/url-pattern&gt;
                &lt;url-pattern&gt;/pages/*.jsp&lt;/url-pattern&gt;
            &lt;/web-resource-collection&gt;

            &lt;auth-constraint&gt;
                &lt;role-name&gt;*&lt;/role-name&gt;
            &lt;/auth-constraint&gt;

            &lt;/security-constraint&gt;
                &lt;login-config&gt;
                &lt;auth-method&gt;${web.modules.auth.type}&lt;/auth-method&gt;
                &lt;realm-name&gt;MyRealm&lt;/realm-name&gt;
            &lt;/login-config&gt;

        &lt;security-constraint&gt;
    </test.security.config>
</properties>

Dans votre web.xml

....
${test.security.config}
....

, Car inexistante propriétés évaluer à une chaîne vide, vos configurations qui n'ont pas cette propriété ou la propriété est vide XML tag) évaluera à une ligne vide ici.

C'est moche, et le xml est difficile à modifier sous cette forme. Cependant, si votre site web.xml est complexe et vous posez un plus grand risque de 4-5 copies du web.xml se désynchroniser, cela peut être une approche qui fonctionnera pour vous.

18
répondu Brian M. Carr 2016-01-18 15:59:23

Une nouvelle configuration a été ajoutée à Maven-war-plugin dans la version 2.1-alpha-2. Son nom est filteringDeploymentDescriptors et il fait exactement ce que vous voulez.

Cela fonctionne:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>
</plugin>

Et cela fonctionne aussi:

<properties>
    <maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
</properties>

Plus d'informations sont disponibles dans la documentation officielle de filteringDeploymentDescriptors.

8
répondu Kristof Neirynck 2014-10-09 14:38:55

Une amélioration de https://stackoverflow.com/a/3298876/2379360

Au lieu de spécifier une propriété personnalisée, utilisez la propriété par défaut maven.guerre.webxml dans vos différents profils.

<profiles>
    <profile>
        <id>profile1</id>
        <properties>
            <maven.war.webxml>path/to/custom/webXml</webXmlPath>
        </properties>
    </profile>
</profiles>
2
répondu tuckerpm 2017-05-23 12:34:38
is there a way to have two web.xml files and select the appropriate one depending on the profile?

Autre que l'approche suggérée par matt b, il est utile de penser l'inverse, principalement parce que dans de nombreux cas, vous devrez regrouper des configurations spécifiques au serveur d'applications qui ne sont pas couvertes par les plugins Maven (afaik). Ceux-ci peuvent très bien avoir des différences entre les profils.

Plus précisément, vous pouvez utiliser un projet parent qui a tous les fichiers communs entre les projets web de différents profils. Ensuite, les projets enfants peuvent avoir un web différent.les fichiers xml et le ID rest fait avec les profils et le maven-war-plugin. Par exemple, j'ai utilisé cette mise en page pour réaliser des builds sans surveillance (autres que la spécification d'un profil) pour différents environnements cibles (développement, uat, etc.)

WebPc
├── common
│   ├── css
│   ├── images
│   ├── js
│   └── WEB-INF
│   └──├── wsdl
│── pom.xml
│
├── WebPc-DEV
│   ├── pom.xml
│   └── src
│       └── main
│           └── webapp
│               └── WEB-INF
│                   ├── geronimo-web.xml
│                   ├── ibm-web-bnd.xml
│                   ├── ibm-web-ext.xml
│                   └── web.xml
├── WebPc-UAT
│   ├── pom.xml
│   └── src
│       └── main
│           └── webapp
│               └── WEB-INF
│                   ├── geronimo-web.xml
│                   ├── ibm-web-bnd.xml
│                   ├── ibm-web-ext.xml
│                   └── web.xml

Le pom de WebPc a le pom suivant

<groupId>my.grp</groupId>
<artifactId>WebPc</artifactId>
<packaging>pom</packaging>

<profiles>
    <profile>
        <id>DEV</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <modules>
            <module>WebPc-DEV</module>
        </modules>
    </profile>
    <profile>
        <id>UAT</id>
        <modules>
            <module>WebPc-UAT</module>
        </modules>
    </profile>
</profiles>

<build>
    <pluginManagement>
        <plugins>

            <!-- copy common resources located on parent
                 project common folder for packaging -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <resourceEncoding>${project.build.sourceEncoding}</resourceEncoding>
                    <webResources>
                        <resource>
                            <directory>../common</directory>
                            <excludes>
                                <exclude>WEB-INF/**</exclude>
                            </excludes>
                        </resource>
                        <resource>
                            <directory>../common/WEB-INF</directory>
                            <includes>
                                <include>wsdl/*.wsdl</include>
                                <include>wsdl/*.xsd</include>
                            </includes>
                            <targetPath>WEB-INF</targetPath>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>

        </plugins>
    </pluginManagement>
</build>

Et c'est le pom pour WebPc-DEV

<parent>
    <groupId>my.grp</groupId>
    <artifactId>WebPc</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</parent>

<artifactId>WebPc-DEV</artifactId>
<packaging>war</packaging>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
        </plugin>
    </plugins>
</build>
0
répondu dkateros 2013-09-25 16:03:52