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

5

Я хочу, чтобы моя сборка 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, не нарушая плагин выпуска?

Ваш Ответ

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>
а) он вышел 2 года назад б) у меня есть "или" раздел
Компилятор Args не будет доступен до версии 3.1
1

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

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

Это вызываетjavac "-Xlint:serial" "-Werror" скорее, чемjavac "-Xlint:serial -Werror".

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

увидетьMCOMPILER-62
не работает для maven-compiler-plugin 2.4
Это интересно. Это ошибка или предполагаемое изменение в поведении? gustafc
Это было о maven-compiler-plugin тоже.
Я попытался & lt; compilerArguments & gt; -classpath: classes & quot; & quot; -d: classes & lt; / compilerArgument И вот что у меня есть: [ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins: maven-compiler-plugin: 2.5: compile (default-compile) в проекте my-project -usage: Невозможно проанализировать конфигурацию mojo org.apache.maven.plugins: maven-compiler-plugin: 2.5: compile: Невозможно присвоить значение & amp; -classpath: classes & quot; & Quot; -d: классы & APOS; (тип: класс java.lang.String) для защищенного java.util.Maporg.apache.maven.plugin.AbstractCompilerMojo.compilerArguments: Невозможно установить поле java.util.Map. HELLLLLP !!!
1

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

0

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

Примечание для 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>

Похожие вопросы