【问题标题】:Can I find out if the java program was launched using java or javaw我可以确定 java 程序是使用 java 还是 javaw 启动的吗
【发布时间】:2010-03-18 10:34:21
【问题描述】:

这与另一位用户较早提出的问题有关,询问 How to detect that code is running inside eclipse IDE

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

我可以找到使用传递的参数

RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
List<String> 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 来启动程序?

【问题讨论】:

    标签: java eclipse javaw


    【解决方案1】:

    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 中运行时,System.console() 仍将返回 null,即使以 java 启动也是如此。

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

    【讨论】:

    • 会吗?您仍然可以写入标准输出流,它只会由操作系统静默定向到 /dev/null 或您使用启动命令附加到它们的任何其他流。与输入流相同,您可以使用 javaw 启动某些内容并从文件或其他流中通过管道输入。
    • @jwenting,是的,即使 System.console() 返回 null,您仍然可以写入 System.out。
    • 显然(至少在 java 7 中),如果您在命令行中运行将输出重定向到文件,System.console() 也是 null。
    【解决方案2】:

    检查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。

    【讨论】:

      【解决方案3】:

      有什么办法可以查出是用java还是javaw启动的?

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

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

      1. 从 javaw 更改为 java:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-09
        • 2022-09-23
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多