当前位置: 首页 > 知识库问答 >
问题:

'system.console()'如果从'gradle run'执行,则返回'null'

林劲
2023-03-14

我有一个简单的Java程序:

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执行它时——没有守护进程运行,我得到以下输出:

Console: null

如果我通过gradle jar; java-cp'.\build\libs\java-terminal.jar'me.fornever.javaterminal.Main从终端执行它,我得到以下:

Console: java.io.Console@3d4eac69

我知道系统。当父进程使用stdout重定向时,console()可能返回null。是否有一些Gradle选项来禁用重定向并使控制台完全可用于我的程序?

我正在为Java开发一个终端库,所以我想在stdin/stdout/stderr中没有Gradle干预的情况下运行我的测试和可执行文件。

请注意,System.console()null不是唯一的问题,而是最明显的问题。实际上,我想从gradle run执行的程序中访问WinAPIWriteConsoleW函数,由于同样的原因,我无法使用此函数System.console()null。所以如果此选项可用,我真的需要在Gradle中禁用输出重定向。

另外请注意,该问题与Gradle build null console对象不同,因为该问题询问如何使用系统。console()在Gradle脚本中,而不是在Gradle run调用的Java程序中;我相信他们在这方面的工作方式不同,因为这两个答案都不适用于我的情况。

共有1个答案

卜飞鸣
2023-03-14

为了<代码>java。io。控制台要可用,子进程的stdin和stdout必须指向Linux/macOS/Unix终端或Windows控制台。最简单的安排方式是从已经以这种方式设置的父进程继承stdin和stdout。然而,Gradle(Gradle-3292)的一个已知限制是,JavaExec任务类型不支持使子进程继承父进程的输入/输出流。

如果GradleJavaExec任务类型被增强以支持stdin/stdout继承,那么这可以用于gradle--no-daemon run

让它与Gradle守护程序一起工作要复杂得多,并且可能涉及特定于平台的代码来操作伪终端或调用Windows控制台API。

 类似资料:
  • 问题内容: 我曾经使用来获取用户的输入/新密码,但想屏蔽该密码,所以我尝试使用。问题是在Eclipse中调试应用程序时返回。我是的新手,不确定这是否是最好的方法吗?我右键单击源文件,然后选择“调试为应用程序”。有什么解决方法吗? 问题答案: 此代码段应该可以解决问题: 在Eclipse中进行测试时,你的密码输入将清晰显示。至少,你将能够进行测试。只是在测试时不要输入你的真实密码。保留供生产使用

  • 问题内容: 我在node.js中编写一个函数来查询PostgreSQL表。 如果该行存在,我想从该行返回id列。 如果不存在,我想将其插入并返回ID()。 我一直在尝试和语句的变体,但似乎无法使其正常工作。 问题答案: 我建议在数据库端进行检查,然后将ID返回给nodejs。 例子: 而不是在Node.js端(在此示例中,我使用的是node-postgres):

  • 问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0

  • 我的数据库中有两个表: 表1:购买物品 表1列出了购买的物品,表2每小时更新一次每件物品的当前价格。因此,从表2中可以清楚地看出,肉类最后一次交易是在2013年2月20日上午10点,而鱼类不是在同一天交易的,它是在2013年2月19日上午9点交易的,鸡肉是在2013年2月20日上午9点交易的。我想做的是,列出表1中的所有项目,并加入表2中各个项目的最后交易价格,如下所示: 这里应该应用什么类型的连

  • 问题内容: 我有以下选择语句,以获取流的下一个预定项目。如果没有匹配的行,我希望它返回默认值。这是我正在使用的行: 那应该可以获取最近计划的项目,但如果它早于查询之前30分钟,则不会。但是,如果用户未安排任何时间,则我需要一个默认值,以便流中实际播放某些内容。我尝试了以下方法: 和: 但是,如果未找到任何行,它将始终返回空结果。我该如何返回默认值? 问题答案: 一种方法 由于只返回一行,因此可以使

  • 我已经连接表与一个 新娘模型: 计划模型: 我有一个查询将这些数据返回到endpoint。 一切都很好,除了一件事。在婚宴桌上,一些身份证上没有计划。因此,当我返回数据时,一些带有一个空的数组。 我想阻止这种情况。如果没有计划,那么我不想返回该新娘id。在这里我如何才能实现我想要的?