Как передать 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>