Java VM在Spring持久层启动时在Mac OS X下崩溃

tit*_*usn 5 java eclipse macos spring

我正在开发一个使用Spring Data的Spring应用程序.我们正在使用Eclipse Luna(4.4.0)并使用Java 8更新20(更高版本中会出现同样的问题).

在Windows下从Eclipse启动应用程序时,它工作正常.在Mac OS X下,出现以下错误:

2015-04-22 14:26:27.492  INFO 5363 --- [           main] o.s.j.d.DriverManagerDataSource          : Loaded JDBC driver: com.mysql.jdbc.Driver
2015-04-22 14:26:27.590  INFO 5363 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'jpaPersistenceUnit'
2015-04-22 14:26:28.715  INFO 5363 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'jpaPersistenceUnit'
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fff890330dd, pid=5363, tid=30215
#
# JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.20-b23 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C  [libobjc.A.dylib+0x10dd]  objc_msgSend+0x1d
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在初始化与mysql的数据库连接时会发生错误.该数据库正在运行.

任何一般的想法如何解决这个问题?我知道这是一个问题,但如果有更多的信息可以帮助我,请告诉我.也许有众所周知的情况会发生这种情况.

更新:

错误日志的内容:

Pastebin:hs_err_pid5336.log

Ste*_*ern 1

当我尝试在无头环境中嵌入具有 JavaFX 依赖项的库时,我遇到了这个确切的问题。最初,我使用 Swing 容器构建了一个 JavaFX 启动包装器。此设置导致 JVM 因上述故障转储而崩溃。

我找到了这个解决方案:/sf/answers/1817839691/。这个想法是删除 Swing 包装器并使用以下代码启动 JavaFX 环境:

import javafx.application.Application;
import javafx.stage.Stage;

public class JavaFXInitializer extends Application {

    private static Object barrier = new Object();

    @Override
    public void start(final Stage primaryStage) throws Exception {
        synchronized (barrier) {
            barrier.notify();
        }
    }

    public static void initialize() throws InterruptedException {
        Thread t = new Thread("JavaFX Init Thread") {
            @Override
            public void run() {
                Application.launch(JavaFXInitializer.class, new String[0]);
            }
        };
        t.setDaemon(true);
        t.start();
        synchronized (barrier) {
            barrier.wait();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在启动时在主应用程序中调用:

try {
    JavaFXInitializer.initialize();
} catch (InterruptedException e) {
    // Failed to initialise JavaFX
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

我的 Spring 应用程序现在可以在 OSX 和 Windows 上顺利运行。