2016-09-18 12 views
7

` dan yürütülen eğer bu basit bir Java programı var:`System.Console()` döner `null` gradle run`

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

Ve bu basit build.gradle: Ben

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

gradle --no-daemon run kullanarak yürütülmesi m, aşağıdaki çıktıyı almak: Iile terminalden çalıştırmak ise

Console: null 
, aşağıdaki alıyorum:

Console: [email protected] 

Ben Üst süreç stdout'u yönlendirmeyi kullandığında System.console()null döndürebilir farkındayım. Yönlendirmeyi devre dışı bırakmak ve konsolu programım için tamamen kullanılabilir hale getirmek için bazı Gradle seçeneği var mı?

Java için bir terminal kitaplığı geliştiriyorum, bu yüzden testlerimi ve yürütülebilir dosyaları stdin/stdout/stderr'de Gradle müdahalesi olmadan çalıştırmak istiyorum.

Lütfen 'un null olduğunu unutmayın, ancak en belirgin olanıdır. Gerçekte, gradle run tarafından yürütülen programdan WinAPI WriteConsoleW işlevine erişmek istiyorum ve bu işlevi System.console()null olduğu için aynı işlevi kullanamıyorum. Bu seçenek varsa gerçekten Graberin çıkış yönlendirmesini devre dışı bırakmalıyım.

Ayrıca bu soruyu bir Gradle senaryonun içine değil gradle run tarafından çağrılan Java programında System.console() nasıl kullanılacağını sorar, çünkü soru Gradle build null console object farklı olduğuna dikkat edin; Bu konuda farklı şekilde çalıştıklarına inanıyorum çünkü cevapların hiçbiri çalışmam ya da davam için geçerli değil.

+0

* nasıl * test edebilirsiniz '' konsol() 'kullanan bir program? Test girişini gönderemezsiniz ve çıktıyı doğrulayamazsınız, bu yüzden ne test ediyorsunuz? – Andreas

+0

@Andreas Her şeyden önce çalışıyor ve herhangi bir istisna atmadan test ediyorum. İkinci seçenek ise win32 'ReadConsoleOutput' veya 'winpty' gibi bir sarıcı gibi platform bağımlı API’yı kullanmaktır. Windows konsolu için bir sarıcı kitaplığı yazıyorum, bu yüzden platform bağımlı çözümler kullanmak için tamam. – ForNeVeR

+0

Bir web araması yaptığınızda, ne buldun? Bu yinelenen soruyu mu buldunuz? – Andreas

cevap

1

java.io.Console'un kullanılabilir olması için, alt süreçler stdin ve stdout'un Linux/macOS/Unix terminaline veya Windows konsoluna işaret etmesi gerekir. Bunu düzenlemenin en kolay yolu, bu şekilde kurulmuş olan bir ana işlemden stdin ve stdout'u miras almanızdır. Ancak, bilinen bir sınırlama (GRADLE-3292) JavaExec görev türünün alt işlemin ana işlemin giriş/çıkış akışlarını miras almasını desteklemediği konusunda bir kısıtlaması vardır.

Grad işlevinde JavaExec görev türü stdin/stdout devralma özelliğini destekleyecek şekilde geliştirildiyse, bu gradle --no-daemon run için çalışabilir.

Gradle daemon ile çalışmaya başlamak çok daha karmaşıktır ve muhtemelen pseudoterminalleri işlemek veya Windows konsol API'sini çağırmak için platforma özel kod içerir.