El filtrado de recursos web con el complemento Maven war no funciona en Eclipse con m2e


Estoy tratando de filtrar un archivo de configuración de Spring usando Maven filtering. Mi POM está configurado así:

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

Y

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

Funciona muy bien cuando se invoca a Maven directamente.

Desafortunadamente, cuando se implementa en caliente la aplicación web en Tomcat 6 con Eclipse WTP y m2e, siempre elige la versión sin filtrar de ApplicationContext.XML. (El archivo applicationContext.xml en la carpeta target / m2e-wtp / web-resources/WEB-INF / context nunca se filtra)

No puedo encontrar ninguna documentación útil sobre el tema. Ni siquiera estoy seguro de si se implementa en m2e.

¿Hay algún problema con mi configuración o esta es una característica no implementada?

Author: Juan Calero, 2012-03-21

6 answers

Bueno, finalmente lo conseguí.

En primer lugar, hice lo que khmarbaise señaló. Moví ApplicationContext.xml a la carpeta de recursos. War plugin webResources está destinado a trabajar con recursos externos, y filtrar un archivo en la carpeta de destino en sí no era la mejor práctica. He actualizado el POM para reflejar la nueva configuración

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

Y

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

Entonces, la mitad del crédito para él. Pero eso no fue suficiente, todavía no funcionó. Me di cuenta de que Maven / m2e de hecho estaba filtrando mi archivo, pero no obtuvo mis archivos de propiedades definidas. Después de algunas pruebas descubrí que m2e está ignorando la opción activeByDefault en la sección de activación de perfiles.

Entonces, agregué mi perfil predeterminado a la configuración del proyecto Maven y luego funcionó

introduzca la descripción de la imagen aquí

 25
Author: Juan Calero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-22 08:32:35

Tuve un problema similar con el filtrado de la web.XML. Resolví el problema reimportando todo el proyecto en eclipse.

La razón era un corrupto /.configuración/org.eclipsar.wst.común.archivo de componentes. En este archivo se define el orden de los archivos copiados en el directorio local web servers deploy. Por ejemplo:

<?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 la web.xml o aplicación.xml existe en varios directorios se tomará del primer directorio encontrado. Por lo tanto su importante que

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

Es la primera entrada.

Encontrará más información en http://wiki.eclipse.org/M2E-WTP_FAQ en la sección " ¿Qué es esta carpeta de recursos web?"

 7
Author: insideout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-27 15:34:22

Ha intentado poner los recursos bajo src/main/resources/WEB-INF/... en lugar de y configurado el área de recursos para filtrar los recursos en lugar de poner la configuración en una ubicación maven no predeterminada.

 1
Author: khmarbaise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 09:38:57

Acabo de tener un problema similar. Mi solución no es elegante y no estoy orgulloso de ella, pero digamos que es aceptable. En mi caso tengo una aplicación spring boot mvc con aplicación swagger (para testers para probar nuestra API). La cosa es que estamos usando esta aplicación en dos entornos, así que creé dos perfiles: dev y test. En dev env nos gustaría disparar la aplicación desde eclipse con solo "ejecutar como" para que la ruta de contexto esté en blanco (sé que se puede configurar en spring java config, pero no es la única marcador de posición que nos gustaría cambiar) y en test env la aplicación se ejecuta en nuestra versión personalizada de tomcat... así que la ruta de contexto es la misma que el nombre de archivo war.

Y aquí está el problema - swagger está llamando a rest docs en esta ruta de contexto y depende del perfil de spring. Así que tenemos un recurso web que necesita ser filtrado. Al principio traté de usar el filtrado 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>
...

Estaba funcionando, pero solo se ejecutaba incrustado en eclipse tomcat o desde la línea de comandos java-jar. no funciona con "ejecutar como" de eclipse.

El recurso se filtró y los vi en web-resource en target, pero eclipse parece estar ejecutándose en un código fuente directamente o está haciendo una copia que no conozco... no puede ver los recursos filtrados... así que pensé que iba a hacer algo como esto:

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

No es la solución más afortunada, porque está modificando el código y no el objetivo, pero al menos está funcionando. Si alguien tuviera alguna sugerencia de cómo hacerlo funcionar sin modificaciones de código sería muy útil.

 0
Author: Piotr Tempes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-17 12:01:04

Hoy tuve un problema similar cuando varios frascos fueron incluidos en la guerra. Configuré el filtrado y comparé los frascos originales con los filtrados. Parecen ser los mismos, pero esto no es cierto. Traté de cambiar el nombre de jar a zip y no pude desempaquetar el contenido debido a la estructura dañada dentro de jar(zip), mientras que el original estaba bien. También se menciona aquí agregar filtrado de recursos web donde se dice que el filtrado tiene que ser falso para evitar corromper sus archivos binarios.

 0
Author: Michal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-04 11:41:46

He intentado todo lo descrito anteriormente sin éxito. Los archivos se filtraron y generaron correctamente en la carpeta "m2e-wtp", pero por alguna razón Eclipse estaba copiando archivos de "target/classes".

Por lo tanto, he cambiado mi pom.xml, cambiando la carpeta de destino de "m2e-wtp" a "target / classes", como code ahead.

Importante: cada vez que necesite ejecutar una compilación de maven en un proyecto, debe cambiar el pom para construir el proyecto.

<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>
 0
Author: Cristiano De Magalhães Almeida,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-01 20:35:44