2010-03-31 18 views
30

Başvuru başlatma sırasında java.awt.headless=true ayarlamak çalışıyorum ama çok geç kaldım gibi göründüğü ve non-başsız modu başladı bile:Ayar java.awt.headless = programlı

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

mi -Djava.awt.headless=true'un yanına doğru başka bir şekilde ayarlanmış başka bir yol var mı? Konsolda hiçbir şeyi yapılandırmamayı tercih ederim.

+2

Ayrıca http://en.wikipedia.org/wiki/Xvfb ilginizi çekebilir. – lexicore

cevap

35

ben statik Sabitler JFreeChart farklı kısımlarını yükleyen bir sınıfta bir main() ile çalışıyordu (ve diğer statik kod). sınıfın üstüne statik yükleme bloğu Hareketli

benim sorun çözüldü.

Bu işe yaramazsa:

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 sınıfının en taşıyarak mümkün olduğunca erken statik blok yürütmek var! düşünmeye zaman

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() {} 
    } 

bu :) anlamda mükemmel hale getirir. Juhu!

+0

Bu garip. benim için neyin işe yaradığı açıkça 'java.awt.headless' 'false' – kumetix

+0

olarak ayarlanmış oldu Statik başlatıcı blokta' 'true '' özelliğinin ayarlanması gayet iyi çalıştı. Kumetix belki de "doğru" yerine "doğruyu" denediniz mi? – Raffael

4

Bu System.setProperty çağrısı araç yaratılmadan önce olduğu için çalışması gerekir:

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()); 
} 
+0

Bu noktada araç takımı yüklü olarak görünüyor, bu yüzden artık bu özelliği değiştiremiyorum. Statik {} bloğu ana bloktan önce bile çağrılmalıdır. – reto

3

Bu parametre Java Virtual Machine örneğin bir argüman olarak ileterek ayarlanabilir düşünüyorum Bu, uygulamanızın diğer bileşenleri üzerinde etkisi olup olmayacağından emin değil.

+1

"Başsız bir başka yol var mı? -Djava.awt.headless yanında gerçek = Konsolda hiçbir şeyi yapılandırmayı tercih etmem." – reto

3

İşte tamamen farklı bir yaklaşım. Bunu kullanıyorum

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(); 
} 

başarıyla başsız bir ortamda (Ubuntu) sunucu tarafı BufferedImages üzerinde çizmek. Bunun en güzel yanı, komut satırında herhangi bir -D değişkeninin ayarlanmasını gerektirmemesi ve DISPLAY değişkenini ayarlamanız gerekmemesidir.

Ayrıca herhangi bir anda bu kodu çalıştırabilirsiniz. Diğer sınıflar yüklenmeden önce bunu çağırmak için endişelenmenize gerek yok.

Farz edelim ki, uzak bir makineden uzaktaki bir makinede Swing arabirimi kullanmaya çalışıyorsanız bu işe yaramayabilir.

0

Böyle JAVA_TOOL_OPTIONS ayarlayabilirsiniz:

JAVA_TOOL_OPTIONS: -Djava.awt.headless = true

Sonra herhangi bir yeni süreçler oturumu sırasında bu ayarı kullanır. Tüm sonraki oturumlar için .bashrc veya .bash_profile öğelerinize (veya herhangi bir kabukun başlangıç ​​dosyası) ekleyebilirsiniz.

Ayrıca böyle bir harika senaryonun ilk satırına ekleyebilirsiniz:

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

Soru, uygulamayı WITHIN'den nasıl ayarlayacağınızdı. – reto