我可以找出java程序是使用java还是javaw启动的

这与其他用户的早期问题有关,询问如何检测代码是否在eclipse IDE中运行 。

我注意到Eclipse总是使用javaw而不是java来启动程序。 (这并不意味着用Eclipse启动了一个用Eclipse启动的程序)。

我可以找到使用的参数

 RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean(); List lst = RuntimemxBean.getInputArguments(); for (int i = 0; i < lst.size(); i++) System.out.println(lst.get(i)); 

但这并没有告诉我它是使用java还是javaw启动的。

  1. 有没有办法找出它是使用java还是javaw启动的?
  2. 为什么Eclipse使用javaw来启动程序?

System.console()将返回null ,因为使用javajavaw的唯一区别是对于javaw ,没有关联的控制台窗口。

这是一个小测试程序,您可以用它来演示:

 import javax.swing.JOptionPane; public class ConsoleTest { public static void main(String[] args) { if (System.console() == null) { JOptionPane.showMessageDialog(null, "System.console() is null"); } else { JOptionPane.showMessageDialog(null, "System.console() is not null"); } } } 

但是,从Eclipse中运行时,即使以java启动, System.console()仍将返回null

在Eclipse的启动配置,JRE选项卡中,如果将Runtime JRE更改为Alternate JRE ,则可以将Java可执行文件从javaw更改为java

检查System.console()对我没有用,因为:

  1. 它需要JDK 6或更高版本
  2. 如果应用程序通过Runtime.exec(String)方法运行,则也会丢失控制台对象。 这对我来说至关重要,因为我们使用了大量的自动脚本。

所以我使用以下解决方案:

 private static boolean isJavaw() { try { System.in.available(); return false; } catch (IOException e) { // invalid handle in case of javaw return true; } } 

适用于JDK 5,6和7。

有没有办法找出它是使用java还是javaw启动的?

根据文档 :javaw命令与java相同,但javaw没有关联的控制台窗口。 当您不希望出现命令提示符窗口时,请使用javaw。 但是,如果由于某种原因启动失败,则javaw启动程序将显示一个包含错误信息的对话框。

为什么eclipse使用javaw来启动程序?

  1. 要从javaw更改为java:

    1. 从菜单栏中选择“运行” – >“运行…”打开启动配置。
    2. 选择应用程序的启动配置。
    3. 切换到’JRE’页面。
    4. 取消选择“使用默认Java可执行文件”
    5. 输入’java’代替’javaw’。
  2. 我认为,因为eclipse开发人员开发GUI应用程序,他们不需要控制台窗口。