2016-09-18 48 views
7

執行我有這個簡單的Java程序:`System.console()``返回如果null`從'gradle這個run`

package me.fornever.javaterminal; 
public class Main { 
    public static void main(String[] args) { 
     System.out.println("Console: " + System.console()); 
    } 
} 

而這個簡單的build.gradle

apply plugin: 'java' 
apply plugin: 'application' 
mainClassName = 'me.fornever.javaterminal.Main' 

當我中號使用gradle --no-daemon run執行它,我得到以下輸出:

Console: null 

如果我通過從終端執行它,我得到如下:

Console: [email protected] 

我知道System.console()可能返回null當父進程使用標準輸出重定向。是否有一些Gradle選項可禁用重定向並使控制檯完全可用於我的程序?

我開發一個Java的終端庫,所以我想運行我的測試和可執行文件沒有標準輸入/輸出/標準錯誤搖籃干預。

請注意,System.console()null不是唯一的問題,但最明顯的一個。在現實中,我想從gradle run執行的程序訪問WinAPI的WriteConsoleW功能,我無法使用此功能,由於同樣的原因被System.console()null。所以我真的需要禁用Gradle中的輸出重定向,如果此選項可用。

也請注意,這個問題是來自Gradle build null console object不同,因爲這個問題問如何使用System.console()一個搖籃腳本的內部,而不是由gradle run調用Java程序;我相信他們在這方面的工作方式不同,因爲這兩個答案都不適用於我的案例。

+0

您如何測試*使用'console()'的程序?你無法發送測試輸入,也無法驗證輸出,那麼你在測試什麼? – Andreas

+0

@Andreas首先我測試它是否可以工作,而不是拋出任何異常。第二種選擇是使用一些與平臺相關的API,比如win32'ReadConsoleOutput'或包裝器,比如'winpty'。我正在爲Windows控制檯編寫包裝庫,因此可以使用平臺相關解決方案。 – ForNeVeR

+0

所以當你做一個網頁搜索時,你發現了什麼?你有沒有發現這個重複的問題? – Andreas

回答

1

爲了使java.io.Console可用,子進程的stdin和stdout必須指向Linux/macOS/Unix終端或Windows控制檯。最簡單的安排方式是繼承已經設置的父進程的stdin和stdout。但是,Gradle(GRADLE-3292)存在一個已知限制,即JavaExec任務類型不支持使子進程繼承父進程的輸入/輸出流。

如果Gradle JavaExec任務類型已增強以支持stdin/stdout繼承,則可以使其工作於gradle --no-daemon run

獲取其與搖籃守護工作將更爲複雜,可能涉及特定於平臺的代碼來處理虛擬終端或調用Windows API控制檯。