5

Quiero hacer que mi build Maven falle cuando me olvidé de declarar serialVersionUIDs en una clase Serializable. Con javac, eso es fácil:¿Cómo paso los múltiples argumentos de línea de comandos de javac, algunos de los cuales incluyen dos puntos, sin romper el complemento de lanzamiento de Maven?

$ javac -Xlint:serial -Werror Source.java 

traducir directamente que a Maven no funciona:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.5.1</version> 
      <configuration> 
       <compilerArgument>-Xlint:serial -Werror</compilerArgument> 
      </configuration> 
     </plugin> 

El compilerArgument se cita, por lo javac recibe sólo un argumento, que contiene -Xlint:serial -Werror, en lugar de -Xlint:serial y -Werror como argumentos separados. Así que lee los documentos, y encontrar compilerArguments:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.5.1</version> 
      <configuration> 
       <compilerArguments> 
        <Xlint:serial /> 
        <Werror /> 
       </compilerArguments> 
      </configuration> 
     </plugin> 

Esto se ve raro - el colon hace serial elemento en el espacio de nombres Xlint, que no está declarado en cualquier lugar - pero funciona ... hasta que usted quiere hacer una liberar:

$ mvn release:prepare

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project my-project: Error reading POM: Error on line 58: The prefix "Xlint" for element "Xlint:serial" is not bound.

Aparentemente, el lector de POM normal maneja los espacios de nombres XML de una forma diferente a la utilizada por el complemento de publicación.

Entonces, ¿cómo paso javac múltiples interruptores de línea de comandos cuando algunos de esos interruptores contienen caracteres que no son válidos para elementos XML simples, sin romper el complemento de lanzamiento?

Respuesta

1

Parece que mientras que los espacios se escapan en compilerArgument, lo mismo no es cierto para las comillas. Por lo tanto, si se rodean los espacios en el argumento con comillas, se obtienen dos argumentos:

<compilerArgument>-Xlint:serial" "-Werror</compilerArgument> 

Esto invoca javac "-Xlint:serial" "-Werror" en lugar de javac "-Xlint:serial -Werror".

No hay nada en los documentos sobre esto que pueda encontrar.

+1

no funciona para maven-compilador-plugin 2.4 – yegor256

+0

Eso es interesante. ¿Es un error o un cambio intencionado en el comportamiento? – gustafc

+0

ver [MCOMPILER-62] (http://jira.codehaus.org/browse/MCOMPILER-62) – yegor256

1

Creo que es un error en maven-compilador-plugin, me presentó un problema para los desarrolladores: MCOMPILER-178

5

Ver http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerArgs

y http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html

Maven 3.1 o posterior

     <source>1.6</source> 
         <target>1.6</target> 
         <showDeprecation>true</showDeprecation> 
         <showWarnings>true</showWarnings> 
         </processors> 
         <compilerArgs> 
          <arg>-verbose</arg> 
          <arg>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</arg> 
         </compilerArgs> 

o Maven 3.0 o anterior

 <compilerArguments> 
     <verbose /> 
     </compilerArguments> 
     <compilerArgument>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArgument> 
+0

El compilerArgs no estará disponible hasta la versión 3.1 – Tony

+0

a) salió hace 2 años b) Tengo una sección "o" –

0

En relación con Kalpesh Soni's answer:

Nota para Maven 3.1 o posterior, según el ejemplo de http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html:

<compilerArgs> 
    <arg>-verbose</arg> 
    <arg>-Xlint:all,-options,-path</arg> 
</compilerArgs> 

Lo anterior es grande a menos que quiera pasar un parámetro adicional que requiere carácter de espacio. En mi caso fue -bootclasspath /path/to/custom/rt.jar. En tal caso hay que dividir esta cadena en cada espacio y pasar a cada parte como un nuevo <arg /> con el fin de no obtener Fatal error compiling: invalid flag: ... Así que el ejemplo de trabajo es:

<compilerArgs> 
    <arg>-verbose</arg> 
    <arg>-Xlint:all,-options,-path</arg> 
    <arg>-bootclasspath</arg><arg>/path/to/custom/rt.jar</arg> 
</compilerArgs> 
Cuestiones relacionadas