41 votos

Maven: Personalizar web.xml de web-proyecto de aplicación de la

Tengo una aplicación web proyecto de Maven, y quiero personalizar el web.xml archivo dependiendo del Perfil que se está ejecutando. Estoy usando Maven-Guerra-plugin, que permite definir un "recursos" del directorio donde los archivos pueden ser filtrados. Sin embargo, el filtrado por sí sola no es suficiente para mí.

En más detalle, quiero incluir (o excluir) el conjunto de la sección de seguridad, en función del perfil que estoy corriendo. Este es el parte:

....
....

<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 esto no se hace fácilmente, hay una manera de tener dos web.xml archivos y seleccionar el más apropiado en función del perfil?

49voto

matt b Puntos 73770

es allí una manera de tener dos web.xml archivos y seleccionar el más apropiado en función del perfil?

Sí, dentro de cada perfil puede agregar una configuración de la maven-war-plugin y configurar cada punto en una diferente web.xml.

<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>
                 ...

Como una alternativa a tener que especificar el maven-war-plugin configuración de cada perfil, puede proporcionar una configuración predeterminada en la sección principal del POM y, a continuación, acaba de sustituir a los perfiles específicos.

O, para ser aún más simple, en la principal <build><plugins> de su POM, utilizar una propiedad para referirse a la webXml de atributo y, a continuación, cambie el valor de los diferentes perfiles

<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>
        ...

32voto

Chris Clark Puntos 221

Hay una tercera, el compromiso de la opción que he implementado en mi proyecto. Se mantiene todo en uno web.xml aunque tanto ella como el pom.xml legible. En mi caso, tuve una necesidad que a veces han de seguridad y, a veces, no tienen seguridad, dependiendo del entorno.

Así que lo que hice fue:

En el pom.xml, definir dos perfiles (o sin embargo muchos de los que necesita). Dentro de los perfiles, se incluyen dos propiedades. Cuando quieres seguridad, deje vacío, como este:

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

Cuando usted desea excluir todos los de la seguridad, se definen de la siguiente manera:

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

Entonces, usted tiene una sola web.xml archivo con el siguiente:

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

El pom.xml maven-guerra-plugin tiene que ser configurado para utilizar el filtrado. La mina se parece a esto:

   <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>
      ...

Así que, básicamente, cuando usted seleccione el perfil para incluir la seguridad, obtendrá dos CRLF adicional en su web.xml. Cuando se selecciona el perfil para que NO incluyen la seguridad, el XML es todavía en la web.xml pero es comentada por lo que se ignora. Me gusta esto porque usted no tiene que preocuparse de mantener varios archivos sincronizados, sin embargo, el XML es todavía legible (y es en la web.xml archivo donde la gente naturalmente buscarlo).

15voto

Brian M. Carr Puntos 762

"matt b" ya ha publicado la respuesta de que es el más maven manera de hacerlo. Es la forma en que me gustaría recomendar hacer que el 99% del tiempo.

Sin embargo, en ocasiones, el archivo de configuración puede ser bastante complicado, y no tiene mucho sentido para duplicar el archivo completo para cada entorno cuando sólo uno de los XML estrofa es diferente. En estos casos, se puede abusar de la propiedad de filtrado para lograr su objetivo.

Advertencia, una cinta adhesiva-y la solución de la siguiente manera, y no va a ser para los débiles de corazón:

En su pom.xml:

La Atención De Los Editores De StackOverflow!!!! El html de la entidad de escape es una parte de la solución. La solución NO funcionará si reemplazar todo con mayor y menor-de los signos. Por favor, deje que la respuesta es...

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

en su web.xml

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

Porque inexistente propiedades de evaluar a una cadena vacía, las configuraciones que no tienen el valor de esta propiedad (o la propiedad está vacía de etiqueta xml) evaluará a una línea en blanco aquí.

Es feo, y el xml es difícil de modificar en este formulario. Sin embargo, si su web.xml es complejo y que suponen un riesgo mayor de 4-5 copias de la web.xml salir de sincronización, este puede ser un enfoque que va a trabajar para usted.

11voto

ajozwik Puntos 4324

Comentario a Chris Clark respuesta. Usted puede invertir en eso, en desarrollo no quieren tener ningún tipo de limitaciones (de seguridad o jndi, otros)

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


${enable.security.start} -->

En el desarrollo se han comentado. Pero en la producción será traducido a (con perfil de maven):

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


<!-- -->

y comentó sección será visible.

0voto

dkateros Puntos 943
is there a way to have two web.xml files and select the appropriate one depending on the profile?

Otros que el enfoque propuesto por matt b, es útil pensar en otra forma, principalmente porque en muchos casos, usted tendrá que paquete de servidor de aplicaciones configuraciones específicas que no están cubiertos por los plugins de maven (afaik). Estos pueden muy bien haber diferencias entre los perfiles.

En concreto, puede utilizar un proyecto principal que tiene todos los archivos comunes entre proyectos web en diferentes perfiles. A continuación, hijo de proyectos pueden tener diferentes web.xml los archivos y el resto de identificación de hecho con los perfiles y el maven-war-plugin. Por ejemplo, he utilizado este diseño para lograr desatendida construye (aparte de la especificación de un perfil) para diferentes entornos (desarrollo, 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

El pom de WebPc tiene las siguientes pom

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

Y este es el pom para 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>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: