为什么Swing会这么想';它在Spring Boot下是无头的,但不是在Spring或普通Java下?
以下代码起作用:为什么Swing会这么想';它在Spring Boot下是无头的,但不是在Spring或普通Java下?,java,spring,swing,spring-boot,Java,Spring,Swing,Spring Boot,以下代码起作用: import javax.swing.*; public class HeadlessExceptionDemo { public static void main(String[] args) { JFrame frame = new JFrame("HeadlessExceptionDemo"); frame.setSize(800, 600); frame.setLocationRelativeTo(null);
import javax.swing.*;
public class HeadlessExceptionDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("HeadlessExceptionDemo");
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
以下代码也起作用:
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.swing.*;
@Configuration
public class HeadlessExceptionDemo {
@Bean
public JFrame frame() {
JFrame frame = new JFrame("HeadlessExceptionDemo");
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
return frame;
}
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(HeadlessExceptionDemo.class);
JFrame frame = ctx.getBean(JFrame.class);
frame.setVisible(true);
}
}
但以下代码不适用:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import javax.swing.*;
@SpringBootApplication
public class HeadlessExceptionDemo {
@Bean
public JFrame frame() {
JFrame frame = new JFrame("HeadlessExceptionDemo");
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
return frame;
}
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(HeadlessExceptionDemo.class, args);
JFrame frame = ctx.getBean(JFrame.class);
frame.setVisible(true);
}
}
导致以下异常:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.swing.JFrame]: Factory method 'frame' threw exception; nested exception is java.awt.HeadlessException
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
... 23 common frames omitted
Caused by: java.awt.HeadlessException: null
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207) ~[na:1.8.0_45]
at java.awt.Window.<init>(Window.java:536) ~[na:1.8.0_45]
at java.awt.Frame.<init>(Frame.java:420) ~[na:1.8.0_45]
at javax.swing.JFrame.<init>(JFrame.java:233) ~[na:1.8.0_45]
at com.inthemoon.snippets.springboot.HeadlessExceptionDemo.frame(HeadlessExceptionDemo.java:15) [classes/:na]
at com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b.CGLIB$frame$0(<generated>) ~[classes/:na]
at com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b$$FastClassBySpringCGLIB$$b7def9bc.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:355) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b.frame(<generated>) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
... 24 common frames omitted
原因:org.springframework.beans.beans实例化异常:未能实例化[javax.swing.JFrame]:工厂方法“frame”引发异常;嵌套异常是java.awt.HeadlessException
在org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:189)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.ConstructorResolver.InstanceUsingFactoryMethod(ConstructorResolver.java:588)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
... 省略23个公共帧
原因:java.awt.HeadlessException:null
在java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207)~[na:1.8.0\u 45]
在java.awt.Window.(Window.java:536)~[na:1.8.0_45]
在java.awt.Frame.(Frame.java:420)~[na:1.8.0_45]
在javax.swing.JFrame.(JFrame.java:233)~[na:1.8.0_45]
在com.inthemoon.snippets.springboot.HeadlessExceptionDemo.frame(HeadlessExceptionDemo.java:15)[classes/:na]
在com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b.CGLIB$frame$0()~[classes/:na]
在com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b$$fastclassbysspringcglib$$b7def9bc.invoke()~[classes/:na]
在org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)~[spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:355)~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b.frame()~[classes/:na]
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_45]
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:1.8.045]
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0\u 45]
在java.lang.reflect.Method.invoke(Method.java:497)~[na:1.8.0_45]
在org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:162)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
... 省略24个公共帧
为什么?:) Spring引导将java.awt.headless默认设置为
true
,如源代码中所示:
至于它为什么这样做,源代码中有一条关于防止图标出现的setHeadless
方法的注释:
/**
* Sets if the application is headless and should not instantiate AWT. Defaults to
* {@code true} to prevent java icons appearing.
* @param headless if the application is headless
*/
public void setHeadless(boolean headless) {
this.headless = headless;
}
而不是这条线
SpringApplication.run(Application.class, args);
使用
如何更改此选项?:)在命令行中添加
-Djava.awt.headless=false
,或者按照此问题中的建议创建您自己的SpringApplicationBuilder:谢谢,但是修复您的代码片段,因为它的第一部分没有样式化!
SpringApplication.run(Application.class, args);
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
builder.headless(false);
ConfigurableApplicationContext context = builder.run(args);