Como faço para passar vários argumentos de linha de comando do javac, alguns dos quais incluem dois pontos, sem quebrar o plugin de liberação do Maven?
Eu quero fazer o meu Maven construir falhar quando me esqueço de declarar serialVersionUIDs em umSerializable
classe. Comjavac
, isso é fácil:
$ javac -Xlint:serial -Werror Source.java
Traduzir diretamente para o Maven não 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>
ocompilerArgument
é citado, entãojavac
recebe apenas um argumento, contendo-Xlint:serial -Werror
, ao invés de-Xlint:serial
e-Werror
como argumentos separados. Então você lê os documentos e encontracompilerArguments
:
<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>
Isso parece estranho - o cólon fazserial
elemento noXlint
namespace, que não é declarado em nenhum lugar - mas funciona ... até que você queira fazer um release:
$ 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, o leitor POM normal manipula namespaces XML de uma maneira diferente daquela usada pelo plug-in de lançamento.
Então, como eu passojavac
várias opções de linha de comando quando alguns desses switches contêm caracteres que não são válidos para elementos XML simples, sem interromper o plug-in de lançamento?