2011-12-19 15 views
6

Recientemente convertí mi aplicación web GWT (GWT 2.4.0) a un proyecto de maven.
Estoy usando maven 2.2.1, gwt-maven plugin (2.4.0), Eclipse Indigo (3.7) y el plugin m2eclipse.Maven Project Builder se invoca cada vez que cambio un archivo fuente (GWT)

Las dependencias y la configuración general parecen estar bien ya que la aplicación web se compila sin ningún problema y también funciona en modo de producción.
Lo mismo se aplica al modo alojado.

Sin embargo, tengo un comportamiento extraño: cuando cambio una sola línea en un archivo fuente Java/GWT, se invoca Maven Project Builder y estos pasos son muy largos (alrededor de 10 segundos) y el eclipse a veces se vuelve inutilizable durante este tiempo.

¿Es este un comportamiento normal de m2eclipse?

Y si lo es, ¿hay alguna forma de acelerarlo?

Nota: tuve que configurar la extensión del ciclo de vida de m2eclipse. Aquí es importante la sección del archivo POM:

<build> 
     <!-- Generate compiled stuff in the folder used for developing mode --> 
     <outputDirectory>${webappDirectory}/WEB-INF/classes</outputDirectory> 

     <plugins> 

      <!-- GWT Maven Plugin --> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>gwt-maven-plugin</artifactId> 
       <version>2.4.0</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>compile</goal> 
          <goal>test</goal> 
         </goals> 
        </execution> 
       </executions> 
       <!-- Plugin configuration. There are many available options, see gwt-maven-plugin 
        documentation at codehaus.org --> 
       <configuration> 
        <runTarget>index.html</runTarget> 
        <hostedWebapp>${webappDirectory}</hostedWebapp> 
        <i18nMessagesBundle>com.gmi.nordborglab.testapp.client.Messages</i18nMessagesBundle> 
       </configuration> 
      </plugin> 

      <!-- Copy static web files before executing gwt:run --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
       <executions> 
        <execution> 
         <phase>compile</phase> 
         <goals> 
          <goal>exploded</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <webappDirectory>${webappDirectory}</webappDirectory> 
       </configuration> 
      </plugin> 
     </plugins> 

     <pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.eclipse.m2e</groupId> 
        <artifactId>lifecycle-mapping</artifactId> 
        <version>1.0.0</version> 
        <configuration> 
         <lifecycleMappingMetadata> 
          <pluginExecutions> 
           <pluginExecution> 
            <pluginExecutionFilter> 
             <groupId>org.codehaus.mojo</groupId> 
             <artifactId>gwt-maven-plugin</artifactId> 
             <versionRange>[2.4.0,)</versionRange> 
             <goals> 
              <goal>resources</goal> 
              <goal>compile</goal> 
             </goals> 
            </pluginExecutionFilter> 
            <action> 
             <execute /> 
            </action> 
           </pluginExecution> 
           <pluginExecution> 
            <pluginExecutionFilter> 
             <groupId>org.apache.maven.plugins</groupId> 
             <artifactId>maven-war-plugin</artifactId> 
             <versionRange>[2.1.1,)</versionRange> 
             <goals> 
              <goal>exploded</goal> 
             </goals> 
            </pluginExecutionFilter> 
            <action> 
             <execute /> 
            </action> 
           </pluginExecution> 

          </pluginExecutions> 
         </lifecycleMappingMetadata> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

    </build> 

Respuesta

13

Esto ilustra perfectamente por qué M2e no deja ningún tipo de plugins "desconocidos" se ejecuten en construcción incremental por defecto (http://wiki.eclipse.org/M2E_plugin_execution_not_covered#Background). La mayoría de los complementos maven no son aptos para la construcción incremental y realizan una compilación completa cada vez que se invocan (y como beneficio adicional, es posible que obtenga fugas del cargador de clases).

En su sección de gestión de plugin, se especificó que GWT: recursos, GWT: compilar y la guerra: descompuestos deberían ser ejecutados. De forma predeterminada, se ejecutan en compilaciones incrementales, es decir, en TODOS los cambios de recursos. Como estos objetivos/complementos no están optimizados para una compilación incremental, tardan un tiempo en completarse.

Si quiere acelerar las cosas, se puede decir M2e para ejecutarlas sólo en construye completa (es decir, después de un proyecto de limpieza) mediante el uso de

<execute> 
    <runOnIncremental>false</runOnIncremental> 
</execute> 

Entonces, haciendo manualmente un eclipse generación limpia automáticamente gatillo su ejecución. Tenga en cuenta que JDT a veces decide promover compilaciones incrementales a las compilaciones completas.

creo (pero puede estar equivocado) que, si estuviera usando el Google Eclipse Plugin, se podía ignorar GWT: recursos y GWT: compilar completo (mediante la sustitución de <ejecutar> con <ignoran>).

9

La razón de la acumulación Maven es más que probable que un habilitados Maven Project Builder (Propiedades del proyecto> Constructores).

Puede desactivarlo y, siempre que tenga el Java Builder seleccionado, Eclipse continuará compilando los archivos editados.

+0

Esa es una idea interesante. ¿Cómo se desencadena la construcción completa? Usando pom.xml> ¿Ejecutar como? –

+0

@MartinKersten: Sí, si recuerdo correctamente Eclipse. No lo he usado en más de 2 años :-P –

3

Bueno, por lo general desmarca:

Proyecto | Construya Automáticamente

Odio que compile todo el tiempo.

+3

El poder de Eclipse y Java destruido en una Acción :-). Me encantaría tener todo compilado todo el tiempo y no me gusta todo lo que no lo hace (como GWT). Me obligó a escribir algo similar a GWT para un gran proyecto en el que valió la pena. Solo tomó 2 semanas y está haciendo su trabajo impecablemente. –

Cuestiones relacionadas