如何在不破坏Maven发布插件的情况下传递javac多个命令行参数,其中一些包括冒号?

当我忘记在Serializable类中声明serialVersionUID时,我想让我的Maven构建失败。 使用javac ,这很简单:

 $ javac -Xlint:serial -Werror Source.java 

直接将其翻译为Maven不起作用:

   org.apache.maven.plugins maven-compiler-plugin 2.5.1  -Xlint:serial -Werror   

引用了compilerArgument ,因此javac只接收一个参数,包含-Xlint:serial -Werror ,而不是-Xlint:serial-Werror作为单独的参数。 所以你阅读了文档,并找到compilerArguments

   org.apache.maven.plugins maven-compiler-plugin 2.5.1        

这看起来很奇怪 – 冒号在Xlint命名空间中创建了serial元素,它没有在任何地方声明 – 但它可以工作……直到你想要发布一个版本:

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

显然,常规POM阅读器以不同于发布插件使用的方式处理XML名称空间。

那么当一些交换机包含对普通XML元素无效的字符时,如何在不破坏发布插件的情况下传递javac多个命令行开关?

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

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

Maven 3.1或更高版本

  1.6 1.6 true true   -verbose -Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml  

或Maven 3.0或更早版本

     -Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml 

我认为这是maven-compiler-plugin中的一个错误,我向开发人员提交了一个问题: MCOMPILER-178

似乎虽然在compilerArgument中转义了空格,但引号却不是这样。 因此,如果用引号括起参数中的空格,则会得到两个参数:

 -Xlint:serial" "-Werror 

这将调用javac "-Xlint:serial" "-Werror"而不是javac "-Xlint:serial -Werror"

我可以找到关于此的文档中没有任何内容。

关于Kalpesh Soni的回答 :

根据http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html中的示例,注意Maven 3.1或更高版本:

  -verbose -Xlint:all,-options,-path  

除非你想传递一个需要空格特征的附加参数,否则上面的内容很棒。 在我的例子中,它是-bootclasspath /path/to/custom/rt.jar 。 在这种情况下,你必须在每个空格上拆分这个字符串,并将每个部分作为新的传递,以免得到Fatal error compiling: invalid flag: ...所以工作示例是:

  -verbose -Xlint:all,-options,-path -bootclasspath/path/to/custom/rt.jar