java - guide - gradle wrapper
`System.console()` devuelve `null` si se ejecuta desde` gradle run` (1)
Tengo este sencillo programa de Java:
package me.fornever.javaterminal;
public class Main {
public static void main(String[] args) {
System.out.println("Console: " + System.console());
}
}
Y esta simple build.gradle
:
apply plugin: ''java''
apply plugin: ''application''
mainClassName = ''me.fornever.javaterminal.Main''
Cuando lo gradle --no-daemon run
usando gradle --no-daemon run
, obtengo el siguiente resultado:
Console: null
Si lo ejecuto desde la terminal a través de la gradle jar; java -cp ''./build/libs/java-terminal.jar'' me.fornever.javaterminal.Main
gradle jar; java -cp ''./build/libs/java-terminal.jar'' me.fornever.javaterminal.Main
, obtengo lo siguiente:
Console: java.io.Console@3d4eac69
Soy consciente de que System.console()
puede devolver null
cuando el proceso principal usa la redirección stdout. ¿Hay alguna opción de Gradle para deshabilitar la redirección y hacer que la consola esté completamente disponible para mi programa?
Estoy desarrollando una biblioteca de terminales para Java, por lo que quiero ejecutar mis pruebas y ejecutables sin la intervención de Gradle en stdin / stdout / stderr.
Tenga en cuenta que System.console()
es null
no es el único problema, sino el más obvio. En realidad, quiero acceder a la función WinAPI WriteConsoleW
desde el programa ejecutado por gradle run
, y no puedo usar esta función debido a las mismas razones por las que System.console()
es null
. Entonces realmente necesito deshabilitar la redirección de salida en Gradle si esta opción está disponible.
También tenga en cuenta que la pregunta es diferente del objeto de consola null de creación de Gradle porque esa pregunta le pregunta cómo usar System.console()
dentro de un script de Gradle y no en el programa de Java invocado por gradle run
; Creo que están trabajando de manera diferente en ese asunto, porque ninguna de las respuestas funciona o es aplicable a mi caso.
Para que java.io.Console
esté disponible, los procesos secundarios stdin y stdout deben apuntar a un terminal Linux / macOS / Unix o una consola de Windows. La forma más fácil de organizar eso es heredar el stdin y el stdout de un proceso padre ya configurado de esa manera. Sin embargo, existe una limitación conocida de Gradle ( GRADLE-3292 ) de que el tipo de tarea JavaExec
no admite que el proceso secundario herede las secuencias de entrada / salida del proceso principal.
Si el tipo de tarea de Gradle JavaExec
se mejoró para admitir la herencia de stdin / stdout, esto podría funcionar para gradle --no-daemon run
.
Conseguir que funcione con el daemon de Gradle sería mucho más complejo, y probablemente involucre un código específico de plataforma para manipular pseudoterminales o llamar a la API de la consola de Windows.