2016-04-22 4 views
3

Если я хочу видеть выход компилятора, я обычно включаю опциюдля maven-compiler-plugin.Нет подробного вывода, когда опция fork используется для maven-compiler-plugin

Однако это не сработает, если оно используется вместе с опцией fork. Компиляция работает в другом процессе, и кажется, что maven не перенаправляет вывод на консоль.

Мой пример кода выглядит следующим образом

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
      <configuration> 
       <fork>true</fork> 
       <verbose>true</verbose> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Кто-нибудь знает, как я могу видеть, что происходит во время компиляции?

В этом link Я вижу, что использование двух опций вместе (fork и verbose) рекомендуется.

Однако, как я уже упоминал, на практике два варианта не работают, когда используются вместе.

+0

Можете подтвердить это. Как ни странно, я не могу найти отчет об ошибке. Ближайшим кажется https://issues.apache.org/jira/browse/MCOMPILER-81, но он был автоматически закрыт = /. – Tunaki

+0

@Tunaki Я выполняю авто-закрытие один раз в год с согласия других разработчиков для очистки JIRA. Билеты не были затронуты в течение по крайней мере трех лет, никогда не будут затронуты снова, независимо от того, важны они или нет. –

+0

@ Michael-O Я пишу ответ, это похоже на ошибку внутри компилятора сплетения. – Tunaki

ответ

4

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, чтобы отслеживать это.

+0

, вы можете сообщить об этом с помощью Plexus Compiler. PR приветствуются, и я очень хочу объединиться. –

+0

@ Michael-O Yep, написав вопрос прямо сейчас :) – Tunaki

+0

@ Michael-O Я создал его. Постараюсь работать над патчем, когда получаю время :)! – Tunaki