Как передать javac несколько аргументов командной строки, некоторые из которых включают двоеточие, не нарушая плагин Maven release?

Я хочу, чтобы моя сборка Maven завершилась неудачей, когда я забыл объявить serialVersionUID в классе 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-элементов, не нарушая плагин release?

Ответ 1

Кажется, что, хотя пробелы экранированы в compilerArgument, то же самое не верно для кавычек. Итак, если вы окружите пробелы в аргументе кавычками, вы получите два аргумента:

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

Это вызывает javac "-Xlint:serial" "-Werror", а не javac "-Xlint:serial -Werror".

В документах об этом ничего не найдено.

Ответ 2

См. 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>

Ответ 3

Я думаю, что это ошибка в maven-компиляторе-плагине, я представил разработчикам проблемы: MCOMPILER-178

Ответ 4

Относительно Ответ Калпеша Сони:

Примечание для Maven 3.1 или более поздней версии в соответствии с примером из http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html:

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