【问题标题】:What happens to "System.out.println()" in executable jar?可执行 jar 中的“System.out.println()”会发生什么?
【发布时间】:2015-02-12 12:30:21
【问题描述】:

假设我从我使用过的代码创建了一个executable jar

System.out.println()

当我们运行可执行 jar 时,没有控制台。那么,这条线会发生什么? java如何处理这种情况?

编辑 01

注意:这种情况是我既不使用控制台运行jar,也不将任何控制台与之关联。

EDIT 02:让事情更清晰:

我知道任何地方都不会打印任何内容,因为没有控制台..!我想知道java 在这种情况下如何处理这条线?为可执行 jar 生成字节码时是否省略了这一行?还是在没有控制台时忽略了这条线?或者什么...

【问题讨论】:

  • “当我们运行可执行 jar 时,没有控制台”——这取决于你如何运行它。如果你从控制台运行java -jar foo.jar,那么有...
  • 我的意思是不使用控制台运行...
  • 那么值得让你的问题更清楚。你说过没有控制台,而那只是有时是真的。
  • 如果您不使用控制台运行程序,那么您将看不到 System.out.print 的内容。将其视为主要用于测试/调试的东西。当您进入生产程序时,不应该使用它。
  • 如果你真的想使用 System.out.print() 那么你可以从控制台重定向到一个文件:stackoverflow.com/questions/2851234/…

标签: java executable-jar system.out


【解决方案1】:

在可执行 jar 文件中运行代码并没有什么特别之处。如果您从控制台运行它,例如使用java -jar foo.jar 时,输出仍将转到控制台。

如果您以某种不附加控制台的方式运行代码(例如 Windows 上的javaw,这是与可执行 jar 文件关联的默认程序),那么输出将无处可去。它不会导致任何错误 - 文本只会丢失。

请注意,在这种情况下,如果您改用 System.console()that 将返回 null。所以:

System.out.printf("Foo%n"); // No problem. Goes nowhere.
System.console().printf("Foo%n"); // Would throw a NullPointerException.

【讨论】:

  • 文本将丢失。那么我可以假设这个println() 方法的编写方式是,如果没有控制台,调用将被忽略?
  • @minarmahmud: 好吧,不要忽略 - 例如,我怀疑如果你使用printf 并且有一些无效的格式字符串,那将会失败。但输出不会去任何地方。
【解决方案2】:

只要您不从控制台窗口 (java -jar executable.jar) 运行应用程序,输出就会被忽略。此外,您可以配置 Java 安装,以便在启动 Java 应用程序时立即启动控制台窗口。然后输出将被写入 JVM 的控制台窗口。您可以在 Java 官方网站上找到一篇文章How do I enable and view the Java Console?

【讨论】:

    【解决方案3】:

    如果你从控制台(java -jar YourJar.jar)打开它,文本会打印在你的控制台窗口中。

    如果您在资源管理器(或类似工具)中打开它,您将看不到文字

    澄清您的第二次编辑: 字节码没有省略,因为编译器无法知道 jar 将在什么上下文中执行。 jar 总是可以从控制台调用,在这种情况下 println 必须留在那里。

    事实上,很多 jar 文件否则完全没用。有很多 Java 程序通过控制台输入和输出与用户交互。 java 程序不需要有一个 GUI(或完全在后台运行)。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多