簡體   English   中英

以編程方式設置 java.awt.headless=true

[英]Setting java.awt.headless=true programmatically

我正在嘗試在應用程序啟動期間設置java.awt.headless=true ,但似乎為時已晚並且非無頭模式已經啟動:

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

除了-Djava.awt.headless=true之外,還有其他方法將 headless 設置為-Djava.awt.headless=true嗎? 我不想在控制台上配置任何東西。

我正在使用一個類中的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() {}
  }

當考慮它時,這是完全有道理的:)。 巨呼!

這應該有效,因為對 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());
}

這是一種完全不同的方法。

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 接口,這可能不起作用。

我認為這個參數可以通過將它作為參數傳遞給 Java 虛擬機來設置,例如

-Djava.awt.headless=true. 不確定這是否會影響應用程序的其他組件。

您可以像這樣設置JAVA_TOOL_OPTIONS

JAVA_TOOL_OPTIONS: -Djava.awt.headless=true

然后任何新進程將在會話期間使用該設置。 您可以將它添加到您的.bashrc.bash_profile (或任何 shell 的啟動文件)以用於所有后續會話。

您還可以將其添加到 groovy 腳本的第一行,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM