当我忘记在Serializable
类中声明serialVersionUID时,我想让我的Maven构建失败。使用javac
,这很简单:
$ javac -Xlint:serial -Werror Source.java
直接将其翻译为Maven不起作用:
<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>
引用了compilerArgument
,因此javac
只收到一个参数,其中包含-Xlint:serial -Werror
,而不是-Xlint:serial
和-Werror
作为单独的参数。所以你阅读了文档,找到了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>
这看起来很奇怪 - 冒号在serial
命名空间中生成Xlint
元素,但未在任何地方声明 - 但它有效...直到你想要发布:
$ 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
多个命令行开关?
答案 0 :(得分:5)
请参阅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或更高版本
<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>
或Maven 3.0或更早版
<compilerArguments>
<verbose />
</compilerArguments>
<compilerArgument>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArgument>
答案 1 :(得分:1)
似乎虽然空格在compilerArgument
中被转义,但引号却不是这样。因此,如果用引号括起参数中的空格,则会得到两个参数:
<compilerArgument>-Xlint:serial" "-Werror</compilerArgument>
这会调用javac "-Xlint:serial" "-Werror"
而不是javac "-Xlint:serial -Werror"
。
我可以找到关于此的文档中的任何内容。
答案 2 :(得分:1)
我认为这是maven-compiler-plugin中的一个错误,我向开发人员提交了一个问题:MCOMPILER-178
答案 3 :(得分:0)
根据http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html中的示例注释Maven 3.1或更高版本:
<compilerArgs>
<arg>-verbose</arg>
<arg>-Xlint:all,-options,-path</arg>
</compilerArgs>
除非你想传递一个需要空格字符的附加参数,否则以上情况很好。就我而言,它是-bootclasspath /path/to/custom/rt.jar
。在这种情况下,您必须在每个空格上拆分此字符串,并将每个部分作为新的<arg />
传递,以便不获取Fatal error compiling: invalid flag: ...
所以工作示例是:
<compilerArgs>
<arg>-verbose</arg>
<arg>-Xlint:all,-options,-path</arg>
<arg>-bootclasspath</arg><arg>/path/to/custom/rt.jar</arg>
</compilerArgs>