如何判断Java应用程序是否在Eclipse控制台中运行(例如,与xterm相比)?

时间:2013-08-12 02:14:02

标签: java eclipse terminal

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

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

我甚至尝试使用反射来查找OutputStream正在包装的System.out子类,假设它可能根据终端类型而有所不同,但无论如何它显然都是FileOutputStream

确定Java程序是否在内置的Eclipse控制台中运行是否有任何不那么强硬的方法,或者这听起来像是没有希望?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

当然,用户总是有机会在Eclipse中使用它,在这种情况下,ANSI转义码在控制台上显示为乱码。

实际上,它比这更复杂。

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

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


另一种可能性可能是:http://code.google.com/p/jlibs/wiki/AnsiColoring ...但我怀疑它在各种操作系统平台上都无法正常运行。

答案 2 :(得分:0)

你必须做一些猜测工作。

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