以编程方式设置 java.awt.headless=true
题
我正在尝试设置 java.awt.headless=true
在应用程序启动期间,但似乎我来得太晚了,非无头模式已经开始:
static {
System.setProperty("java.awt.headless", "true");
/* java.awt.GraphicsEnvironment.isHeadless() returns false */
}
除了之外还有其他方法将 headless 设置为 true -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());
}
我觉得这个参数可以通过将其作为参数传递给Java虚拟机例如被设置
-Djava.awt.headless=true.
不知道这是否会对您的应用程序的其他组件的影响。
这是一种完全不同的方法。
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_TOOL_OPTIONS这样的:
JAVA_TOOL_OPTIONS:-Djava.awt.headless =真
然后任何新进程将在会议期间使用该设置。你可以把它添加到您的.bashrc或者.bash_profile中(或者其他的shell启动文件),所有后续会话。
可以还它添加到这样的常规脚本的第一行:
cat hello.groovy
#!/usr/bin/env groovy -Djava.awt.headless=true
println hello
不隶属于 StackOverflow