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

时间:2012-07-05 06:44:35

标签: java maven javac maven-release-plugin maven-compiler-plugin

当我忘记在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多个命令行开关?

4 个答案:

答案 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)

Kalpesh Soni's answer

有关

根据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>