【问题标题】:How to tell if a Java application is running within the Eclipse console (versus, for example, xterm)?如何判断 Java 应用程序是否在 Eclipse 控制台中运行(例如,相对于 xterm)?
【发布时间】:2013-08-13 06:34:31
【问题描述】:

我正在编写一个使用 ANSI 颜色代码打印日志消息的 Java 框架。当然,用户总是有可能在 Eclipse 中使用它,在这种情况下,ANSI 转义码在控制台上显示为垃圾字符。最好能自动检测到这一点,这样用户就不必手动关闭它了。

我已经在谷歌上搜索了一些关于这个主题的内容,我怀疑它无法完成,但没有多少人尝试过,所以我认为值得一问。想到的一种方法是检查"xterm".equals(System.getenv("TERM")),这某种是否有效,但有很多异常并且在Windows上根本不起作用(我正在使用JANSI库来获取Windows 彩色终端支持)。想到的另一个选择是尝试调用外部程序来检查名为 eclipse 的进程是否正在运行,但这是一个肮脏的 hack,并且也有边缘情况(如果有人在终端中运行程序,颜色会消失同时也使用 Eclipse)。

我什至尝试使用反射来查找 System.out 正在包装的 OutputStream 子类,假设它可能因终端类型而异,但无论如何它显然是 FileOutputStream

有没有更简单的方法来确定 Java 程序是否在内置的 Eclipse 控制台中运行,或者这是否像听起来那样无望?

【问题讨论】:

    标签: java eclipse terminal


    【解决方案1】:

    您将不得不做一些猜测工作。

    1. 检查 TERM 环境变量
    2. 检查 SHELL 环境变量
    3. 检查父 PID 指向的对象

    【讨论】:

      【解决方案2】:

      当然,用户总是有可能在 Eclipse 中使用它,在这种情况下,ANSI 转义码在控制台上显示为垃圾字符。

      实际上,它比这更复杂。

      stdout “不是 Eclipse”这一事实并不能保证它能够理解 ANSI 终端代码。输出可能被重定向到一个文件,或者您可能正在与不支持 ANSI 的远程控制台(甚至是物理终端/打印机)交谈。

      我认为您最好的选择是使用 TERM 环境变量进行“最佳猜测”,并使用命令行选项(或首选项)来覆盖它。或者根本不用为控制台输出着色。


      另一种可能性是:http://code.google.com/p/jlibs/wiki/AnsiColoring ...但我怀疑它在广泛的操作系统平台上运行得不够好。

      【讨论】:

        【解决方案3】:

        我不确定您是否可以检测是否在 Eclipse 中运行,但您可以检测它是否作为 jar 运行。 (Eclipse 将文件夹加载为类路径,而不是 jar 文件)只需比较 ClassName.class.getResource 与 ClassName.class.getResourceAsStream。 getResourceAsStream 在 jar 或其他环境中工作,而 getResource 在 jar 中不起作用(我认为)。

        【讨论】:

          猜你喜欢
          • 2010-12-01
          • 2010-11-14
          • 1970-01-01
          • 2012-01-07
          • 1970-01-01
          • 2013-02-11
          • 1970-01-01
          • 2018-02-23
          • 1970-01-01
          相关资源
          最近更新 更多