Spring Boot:java.awt.HeadlessException
Posted
技术标签:
【中文标题】Spring Boot:java.awt.HeadlessException【英文标题】:Spring Boot : java.awt.HeadlessException 【发布时间】:2018-12-02 21:44:48 【问题描述】:当我们试图获取剪贴板实例时。
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
我也尝试通过设置头部来运行 Spring Boot 应用程序。
SpringApplicationBuilder builder = new SpringApplicationBuilder(SpringBootApplication.class,args);
builder.headless(false).run(args);
我们遇到了异常。
java.awt.HeadlessException
at sun.awt.HeadlessToolkit.getSystemClipboard(HeadlessToolkit.java:309)
at com.kpit.ecueditor.core.utils.ClipboardUtility.copyToClipboard(ClipboardUtility.java:57)
有人可以建议我在这里缺少什么。
如果我在简单的 java 应用程序中运行相同的剪贴板代码,它可以工作,但不能在 spring boot 应用程序中工作。
【问题讨论】:
Spring 是一个 Web 框架,它将在其中运行的上下文是 Web 服务器(或控制台应用程序,如果你愿意的话)。它不太可能以任何方式访问剪贴板,或者更普遍的awt
。
Spring Core 是一个 DI 框架,与 Web 应用程序没有任何关联。您也可以在 Swing 或 JavaFX 或其他 GUI 应用程序中使用 Spring。
如果我们尝试访问 jframe 和 awt 的其余部分,那么它可以工作,但是对于剪贴板我有问题.. 是否可以通过任何其他方式获取系统剪贴板实例
【参考方案1】:
代替这一行
SpringApplication.run(Application.class, args);
使用
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
builder.headless(false);
ConfigurableApplicationContext context = builder.run(args);
会有用的
【讨论】:
我尝试了这个建议,但我仍然得到无头异常。我试过的都没有用。无论 System.setPropety("java.awt.headless", "false") 或尝试更改 Spring 配置,图形环境仍然显示 isHeadless 为真,如上所示,服务每次都崩溃,可靠地在“showOpenDialog”。这很奇怪,因为相同的代码在 SPARKJAVA REST 服务中运行良好(但不是此应用程序的框架。) @Morkus 你找到解决问题的方法了吗?【参考方案2】:我遇到了同样的异常,在 Swing 应用程序中使用 Spring Boot 2。
以下是对我有用的示例:
在主类中:
//Main.java
@SpringBootApplication
public class Main implements CommandLineRunner
public static void main(String[] args)
ApplicationContext contexto = new SpringApplicationBuilder(Main.class)
.web(WebApplicationType.NONE)
.headless(false)
.bannerMode(Banner.Mode.OFF)
.run(args);
@Override
public void run(String... args) throws Exception
SwingUtilities.invokeLater(() ->
JFrame frame = new JFrame();
frame.setVisible(true);
);
在测试类中,你需要设置 java.awt.headless 属性,这样你在测试代码时就不会得到 java.awt.HeadlessException:
//MainTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class MainTest
@BeforeClass
public static void setupHeadlessMode()
System.setProperty("java.awt.headless", "false");
@Test
public void someTest()
对于那些使用 JavaFX 遇到此异常的人,this answer 可能会有所帮助。
【讨论】:
【参考方案3】:您也可以在运行应用程序时只传递一个 JVM 参数,无需更改代码:
-Djava.awt.headless=false
在 springboot 2.2.5.RELEASE 上测试
【讨论】:
以上是关于Spring Boot:java.awt.HeadlessException的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?
《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》