以编程方式设置java.awt.headless = true

时间:2010-03-31 11:17:04

标签: java awt headless

我正在尝试在应用程序启动期间设置java.awt.headless=true,但看起来我已经太晚了,非无头模式已经开始了:

static {
    System.setProperty("java.awt.headless", "true");
    /* java.awt.GraphicsEnvironment.isHeadless() returns false */
}

-Djava.awt.headless=true旁边还有另一种无头的方法吗?我不想在控制台上配置任何东西。

5 个答案:

答案 0 :(得分:38)

我在一个类中使用main(),它在常量(和其他静态代码)中静态加载JFreeChart的不同部分。

将静态加载块移动到类的顶部解决了我的问题。

这不起作用:

  public class Foo() {
    private static final Color COLOR_BACKGROUND = Color.WHITE;

    static { /* too late ! */
      System.setProperty("java.awt.headless", "true");
      System.out.println(java.awt.GraphicsEnvironment.isHeadless());
      /* ---> prints false */
    }

    public static void main() {}
  }

让java尽可能早地执行静态块,将其移到课堂顶部!

  public class Foo() {
    static { /* works fine! ! */
      System.setProperty("java.awt.headless", "true");
      System.out.println(java.awt.GraphicsEnvironment.isHeadless());
      /* ---> prints true */
    }

    private static final Color COLOR_BACKGROUND = Color.WHITE;

    public static void main() {}
  }

在考虑它时,这非常有意义:)。瑚!

答案 1 :(得分:4)

这应该有效,因为在创建工具包之前调用System.setProperty:

public static void main(String[] args)
{
    // Set system property.
    // Call this BEFORE the toolkit has been initialized, that is,
    // before Toolkit.getDefaultToolkit() has been called.
    System.setProperty("java.awt.headless", "true");

    // This triggers creation of the toolkit.
    // Because java.awt.headless property is set to true, this 
    // will be an instance of headless toolkit.
    Toolkit tk = Toolkit.getDefaultToolkit();

    // Check whether the application is
    // running in headless mode.
    GraphicsEnvironment ge = 
        GraphicsEnvironment.getLocalGraphicsEnvironment();
    System.out.println("Headless mode: " + ge.isHeadless());
}

答案 2 :(得分:3)

我认为可以通过将其作为参数传递给Java虚拟机来设置此参数,例如

-Djava.awt.headless=true.不确定这是否会对您应用的其他组件产生影响。

答案 3 :(得分:3)

这是一种完全不同的方法。

try {
    Field defaultHeadlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("defaultHeadless");
    defaultHeadlessField.setAccessible(true);
    defaultHeadlessField.set(null,Boolean.FALSE);
    Field headlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("headless");
    headlessField.setAccessible(true);
    headlessField.set(null,Boolean.TRUE);
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

我成功地使用它在无头环境(Ubuntu)上绘制服务器端的BufferedImages。 关于这一点的好处是它不需要在命令行上设置任何-D变量,也不需要设置DISPLAY变量。

您也可以随时执行此代码。在加载其他类之前,您不必担心调用它。

如果您尝试从无头环境中驱动远程计算机上的Swing界面,我认为这可能不起作用。

答案 4 :(得分:-1)

您可以像这样设置JAVA_TOOL_OPTIONS:

JAVA_TOOL_OPTIONS:-Djava.awt.headless = true

然后,任何新进程都将在会话期间使用该设置。您可以将它添加到.bashrc或.bash_profile(或任何shell的启动文件)中以用于所有后续会话。

您还可以将它添加到groovy脚本的第一行,如下所示:

 $this->db->distinct();
 $this->db->select('attnDate');
 $this->db->from('tbl_attendance');
 $this->db->order_by('attnDate');
 $query = $this->db->get();
 return $query->result_array();