2016-04-22 153 views
3

如果我想查看編譯器輸出,通常我爲maven-compiler-plugin啓用verbose選項。當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):在plexus-compilerThis issue是固定的,在這個問題給定的代碼將作爲2.8版本。


通過源代碼讀取後,這是在2.7 plexus-compiler的一個錯誤,這是內部使用maven-compiler-plugin 3.5.1編譯Java源庫。

因此,它是這樣的碼:該maven-compiler-plugin填充稱爲CompilerConfiguration一個對象,並根據在POM中的給定的配置元件設置其forkverbose。所述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)檢索和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()))); 

通知如何消息,這將稍後形成插件輸出的內容,僅填充錯誤而不填充標準輸出。所以簡單地說:標準輸出在詳細模式下被正確設置,但是它被忽略並且不被轉換成正確的編譯結果。


我沒有看到解決方法(除了不分叉)。我在他們的GitHub中創建了issue 20來跟蹤這個。

+0

你可能想用Plexus編譯器報告。 PR是受歡迎的,我渴望合併。 –

+0

@ Michael-O是的,現在寫一個問題:) – Tunaki

+0

@ Michael-O我創建了它。當我得到時間的時候會嘗試修補一個補丁:)! – Tunaki

相關問題