代码之家  ›  专栏  ›  技术社区  ›  reto

设置Java.AWT.无头=编程真

  •  32
  • reto  · 技术社区  · 16 年前

    我在试着设置 java.awt.headless=true 在应用程序启动过程中,但似乎太晚了,而且非无头模式已经启动:

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

    有没有另一种方法可以让无头变成真的 -Djava.awt.headless=true ?我不想在控制台上配置任何东西。

    5 回复  |  直到 8 年前
        1
  •  37
  •   Gray droiddeveloper    10 年前

    我和一个 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() {}
      }
    

    当考虑到这一点时,这是完全有意义的:)。小精灵!

        2
  •  4
  •   pitpod    16 年前

    这应该可以工作,因为对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());
    }
    
        3
  •  3
  •   Bharat Joshi    15 年前

    我认为这个参数可以通过将它作为参数传递给Java虚拟机来设置。

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

        4
  •  3
  •   javac    11 年前

    这里有一个完全不同的方法。

    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变量,也不需要设置显示变量。

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

    我想,如果您试图从无头环境中在远程计算机上驱动swing接口,那么这可能行不通。

        5
  •  -1
  •   Mike Kinney    10 年前

    您可以设置如下Java_工具选项:

    java_tool_选项:-djava.awt.headless=true

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

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

    cat hello.groovy
    #!/usr/bin/env groovy -Djava.awt.headless=true
    println hello
    
    推荐文章