如何在不破坏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