5

当我忘记在类中声明 serialVersionUIDs 时,我想让我的 Maven 构建失败Serializable。有了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 命名空间,而不是发布插件使用的方式。

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

4

4 回答 4

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>
于 2014-05-19T16:54:33.690 回答
2

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

<compilerArgument>-Xlint:serial" "-Werror</compilerArgument>

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

在文档中我找不到任何关于此的内容。

于 2012-07-05T06:44:36.633 回答
1

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

于 2012-07-23T10:16:49.893 回答
1

关于Kalpesh Soni 的回答

根据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>
于 2017-02-04T15:55:45.413 回答