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核心原理剖析》

spring-boot-quartz, 依赖spring-boot-parent

spring-boot系列:初试spring-boot

Spring Boot:Spring Boot启动原理分析

Spring Boot:Spring Boot启动原理分析