UPDATE (25/06/2016): This issue из plexus-compiler
был зафиксирован и данный код в вопросе будет работать в версии 2.8.
После прочтения исходного кода, это ошибка в plexus-compiler
2.7, который является библиотекой внутренне используемой maven-compiler-plugin
3.5.1 для компиляции исходного кода Java.
Так он идет, как это в коде: maven-compiler-plugin
заполнит объект под названием CompilerConfiguration
и устанавливает его fork
и verbose
согласно данному элементу конфигурации в POM. verbose
элемент is correctly read and added to the compiler arguments:
if (config.isVerbose())
{
args.add("-verbose");
}
Затем есть переключатель depending on whether we're forking or not.
Если это не так, мы в конечном счете сводятся к коду, ссылающегося javac
и его выход is stored in the compilation result:
ok = (Integer) compile.invoke(null, new Object[]{ args, new PrintWriter(out) });
messages = parseModernStream(ok.intValue(), new BufferedReader(new StringReader(out.toString())));
наконец returned with:
return new CompilerResult(success, messages);
Пока все хорошо, maven-compiler-plugin
будет обходить эти сообщения и выводить их в консоль. Поскольку параметр verbose
был установлен, у нас будут все сообщения.
Если мы, то исполняемый файл (который по умолчанию к javac
в PATH) извлекается и the compiler arguments are correctly set:
for (String key : config.getCustomCompilerArgumentsAsMap().keySet())
{
if (StringUtils.isNotEmpty(key) && key.startsWith("-J"))
{
cli.addArguments(new String[]{ key });
}
}
Мы можем подтвердить это, Maven в режиме отладки с -X
, мы увидим сообщение:
[DEBUG] Excutable:
[DEBUG] "C:\Program Files\Java\jdk1.8.0_74\bin\javac.exe"
[DEBUG] Command line options:
[DEBUG] -d ... -classpath ... -sourcepath ... -s ... -g -target 1.8 -source 1.8 -verbose
Обратите внимание на -verbose
в конце.
И вот, это ошибка. Стандартный вывод будет храниться внутри out
переменной
CommandLineUtils.StringStreamConsumer out = new CommandLineUtils.StringStreamConsumer();
правильно, используемый в качестве параметра метода компиляции, but completely ignored afterwards:
returnCode = CommandLineUtils.executeCommandLine(cli, out, err);
messages = parseModernStream(returnCode, new BufferedReader(new StringReader(err.getOutput())));
Обратите внимание, как сообщения, которые будут более поздняя форма того, что выводится плагином, заполняется только ошибками, а не стандартным выходом. Так что просто: стандартный вывод правильно задан в подробном режиме, но он игнорируется и не переводится в правильный результат компиляции.
Я не вижу обходного пути для этого (за исключением не разветвления). Я создал issue 20 в своем GitHub, чтобы отслеживать это.
Можете подтвердить это. Как ни странно, я не могу найти отчет об ошибке. Ближайшим кажется https://issues.apache.org/jira/browse/MCOMPILER-81, но он был автоматически закрыт = /. – Tunaki
@Tunaki Я выполняю авто-закрытие один раз в год с согласия других разработчиков для очистки JIRA. Билеты не были затронуты в течение по крайней мере трех лет, никогда не будут затронуты снова, независимо от того, важны они или нет. –
@ Michael-O Я пишу ответ, это похоже на ошибку внутри компилятора сплетения. – Tunaki