pom plugin needed mvn compiler compile artifactid java maven javac

plugin - Solución para el error de orden de compilación javac en maven



mvn install maven compiler plugin (5)

Estoy encontrando un error en el compilador de Java donde el orden de los archivos enviados para compilación puede hacer que el código no se compile. He detallado el código para aislar la menor cantidad de código que pude reproducir el problema, lo que dio como resultado tres archivos de origen (1 clase cada uno).

public interface ActionSpec { public abstract int run(String param); } public enum Actions implements ActionSpec { SKIP { public int run(String d) { return 0; } }; } public class Program { public static void main(String[] args) { Actions.SKIP.run("hello"); } }

El problema es reproducible al tener argumentos javac en un orden particular. En resumen, para tener éxito, la clase de Acciones siempre debe compilarse antes de la clase de Programa que la usa, de lo contrario, javac simplemente no puede lidiar con ella de una manera sensata:

# this case fails echo "Trying order: javac Program.java Actions.java ActionSpec.java" rm *class javac -verbose Program.java Actions.java ActionSpec.java # this case fails #rm *class #javac Program.java Actions.java ActionSpec.java # this case fails #rm *class #javac ActionSpec.java Program.java Actions.java # this case succeeds #rm *class #javac ActionSpec.java Actions.java Program.java # this case succeeds #rm *class #javac Actions.java ActionSpec.java Program.java # this case succeeds #rm *class #javac Actions.java Program.java ActionSpec.java

El error de compilación, cuando ocurre, es siempre el mismo: no se puede encontrar el método de ejecución en las instancias de enumeración de Acciones, aunque todos implementan una interfaz que tiene ese método de ejecución.

Program.java:6: cannot find symbol symbol : method run(java.lang.String) location: class problem.Actions Actions.SKIP.run("hello");

El error parece estar relacionado con este reportado en el sitio de Oracle . Estoy usando javac 1.6.0_29, en mac os x 10.7.2 x86_64, pero también lo he reproducido en Linux.

Este problema se hizo evidente cuando uso Maven para compilar y no parece tener ningún control sobre el orden de compilación. Así que estoy buscando una solución para forzar a maven a compilar archivos en un orden que evite este error del compilador, o jugar con las banderas del compilador (o algo así) para evitarlo. El problema surge en las estaciones de trabajo y en entornos de integración continua por igual, por lo que tendría que funcionar en todos los ámbitos. ¿Alguna sugerencia?

EDITAR: acabo de probar la siguiente solución, que a pesar de simplemente asignar la enumeración en cuestión a una variable con el tipo de interfaz que implementa, hace que el error desaparezca de manera sorprendente.

public class Program { public static void main(String[] args) { ActionSpec a = Actions.SKIP; a.run("hello"); } }

Todavía interesado en otras opiniones.


Así es como lo haría:

  • Mueva la interfaz ActionSpec a otro proyecto Maven. Por lo general, tenemos interfaces y clases de dominio comunes en su propio proyecto, por ejemplo, foo-service-specs .
  • Mantenga las otras clases en el proyecto de implementación, por ejemplo, foo-service-impl .
  • Incluya el proyecto foo-service-specs como una dependencia en foo-service-impl .

Al hacer esto, puede asegurarse de que el orden de compilación esté funcionando, y también debería funcionar para una integración continua.



Intenta múltiples ejecuciones del plugin compilador. El uso default-compile como primer ID de ejecución agrega la nueva configuración a la ejecución del compilador predeterminado de Maven. Use los elementos de configuración <includes/> en la ejecución predeterminada para compilar primero las enumeraciones. Para la segunda ejecución, utilizaría una combinación de <includes> y <excludes> , donde <includes> sería todo su código y las exclusiones serían las enumeraciones ya compiladas.

Creo que esto funcionará para tu programa de ejemplo, pero no lo probé. He probado algo similar antes con Maven 3 y funcionó bien.

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> <executions> <execution> <id>default-compile</id> <goals><goal>compile</goal></goals> <configuration> <includes> <include>**/Actions.*</include> </includes> </configuration> </execution> <execution> <id>second</id> <goals><goal>compile</goal></goals> <configuration> <includes> <include>**/*</include> </includes> <excludes> <exclude>**/Actions.*</exclude> </excludes> </configuration> </execution> </executions> </plugin>


Jugué, y encontré que agregando un elenco simple:

public static void main(String[] args) { ((ActionSpec)Actions.SKIP).run("hello"); }

resuelve este problema Pasar esta enumeración como parámetro del método como interfaz también haría el truco


Tuvimos el mismo problema. Múltiples ejecuciones del plugin de maven compiler nos funcionó ...