Spring Boot打包JAR启动时创建EntityManagerFactory遇NegativeArraySizeException
Spring Boot JAR启动时SQLite数据库连接引发NegativeArraySizeException异常
我开发了一个Spring Boot应用,用来从resources目录下的SQLite数据库(.mbtiles格式)提供地图瓦片服务。在IDE里运行完全正常,但用java -jar命令启动编译好的JAR包时出现了异常。数据库已经被打包进JAR文件里,但不确定这是不是问题的根源。
异常信息
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mapEntityManagerFactory' defined in class path resource [com/app/application/configuration/MapDataSourceConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NegativeArraySizeException: -947658752 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mapEntityManagerFactory' defined in class path resource [com/app/application/configuration/MapDataSourceConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NegativeArraySizeException: -947658752 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) at com.app.map.MapApplicationKt.main(MapApplication.kt:12) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) Caused by: java.lang.NegativeArraySizeException: -947658752 at org.hibernate.boot.archive.internal.ArchiveHelper.getBytesFromInputStream(ArchiveHelper.java:181) at org.hibernate.boot.archive.internal.ArchiveHelper.getBytesFromInputStreamSafely(ArchiveHelper.java:139) at org.hibernate.boot.archive.spi.AbstractArchiveDescriptor.buildByteBasedInputStreamAccess(AbstractArchiveDescriptor.java:75) at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:117) at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:48) at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:76) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:107) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:269) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:182) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:52) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
相关配置
Application.yml配置
spring: jpa: database-platform: org.hibernate.dialect.SQLiteDialect datasource: map: url: jdbc:sqlite:backend/src/main/resources/db/mbtile/map.mbtiles driver-class-name: org.sqlite.JDBC configuration: maximum-pool-size: 1
MapDataSourceConfiguration配置类
@Configuration @EnableTransactionManagement @EnableJpaRepositories( basePackageClasses = [Tile::class], basePackages = ["com.app.domain.repository.map"], entityManagerFactoryRef = "mapEntityManagerFactory" ) class MapDataSourceConfiguration { @Bean @ConfigurationProperties("spring.datasource.map") fun mapDataSourceProperties(): DataSourceProperties = DataSourceProperties() @Bean @ConfigurationProperties("spring.datasource.map.configuration") fun mapDataSource(properties: DataSourceProperties): HikariDataSource = properties.initializeDataSourceBuilder().type(HikariDataSource::class.java).build() @Bean fun mapEntityManagerFactory(): LocalContainerEntityManagerFactoryBean = (LocalContainerEntityManagerFactoryBean()).apply { dataSource = mapDataSource(mapDataSourceProperties()) setPackagesToScan("com.app.domain.model.map") jpaVendorAdapter = HibernateJpaVendorAdapter() } }
Tile.kt实体类
@Entity @IdClass(TileCompositeKey::class) @Table(name = "tiles") data class Tile( @Id @Column(name = "zoom_level") val zoomLevel: Int = 0, @Id @Column(name = "tile_column") val tileColumn: Int? = 0, @Id @Column(name = "tile_row") val tileRow: Int? = 0, @Column(name = "tile_data") val tileData: ByteArray? = null, ) private class TileCompositeKey( private val zoomLevel: Int? = 0, private val tileColumn: Int? = 0, private val tileRow: Int? = 0, ) : Serializable
Build.gradle.kts依赖
dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.xerial:sqlite-jdbc:3.32.3.2") implementation("com.github.gwenn:sqlite-dialect:0.1.0") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.flywaydb:flyway-core") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.14.1") implementation("com.fasterxml.jackson.core:jackson-databind:2.14.1") }
有人遇到过这个问题吗?
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

