jmix2.0 部署报错

建了一个额外的数据库,似乎以jar运行时,一直死在第二个数据库连接上,idea 跑是完全没问题的,能帮忙看下可能的原因么

2023-09-19T08:47:25.595+08:00  INFO 1952 --- [main] liquibase.executor                       : Changelog query completed.
2023-09-19T08:47:26.048+08:00  WARN 1952 --- [main] i.j.d.i.JmixBaseEntityManagerFactoryBean : Cannot find persistence.xml for 'timescaledb' store. Falling back to classpath scan for entity classes.
2023-09-19T08:47:26.048+08:00  INFO 1952 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Starting...
2023-09-19T08:47:26.329+08:00  INFO 1952 --- [main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-2 - Added connection org.postgresql.jdbc.PgConnection@2e4eda17
2023-09-19T08:47:26.329+08:00  INFO 1952 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Start completed.
2023-09-19T08:47:28.463+08:00  WARN 1952 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'timescaledbEntityManagerFactory' defined in class path resource [com/hetan/heating/TimescaledbStoreConfiguration.class]: Index 0 out of bounds for length 0
2023-09-19T08:47:28.463+08:00  INFO 1952 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Shutdown initiated...
2023-09-19T08:47:28.479+08:00  INFO 1952 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Shutdown completed.
2023-09-19T08:47:28.479+08:00  INFO 1952 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-09-19T08:47:28.479+08:00  INFO 1952 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2023-09-19T08:47:28.479+08:00  INFO 1952 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-09-19T08:47:28.495+08:00  INFO 1952 --- [main] .s.b.a.l.ConditionEvaluationReportLogger : 
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-09-19T08:47:28.529+08:00 ERROR 1952 --- [main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'timescaledbEntityManagerFactory' defined in class path resource [com/hetan/heating/TimescaledbStoreConfiguration.class]: Index 0 out of bounds for length 0
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1155) ~[spring-context-6.0.11.jar!/:6.0.11]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) ~[spring-context-6.0.11.jar!/:6.0.11]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[spring-context-6.0.11.jar!/:6.0.11]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.2.jar!/:3.1.2]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-3.1.2.jar!/:3.1.2]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[spring-boot-3.1.2.jar!/:3.1.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-3.1.2.jar!/:3.1.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.2.jar!/:3.1.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.2.jar!/:3.1.2]
	at com.hetan.heating.HeatingApplication.main(HeatingApplication.java:42) ~[classes!/:0.0.1-SNAPSHOT]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[heating-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[heating-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[heating-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[heating-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
Caused by: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[na:na]
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) ~[na:na]
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) ~[na:na]
	at java.base/java.util.Objects.checkIndex(Objects.java:361) ~[na:na]
	at java.base/java.util.ArrayList.get(ArrayList.java:427) ~[na:na]
	at org.springframework.core.annotation.AnnotationTypeMappings.get(AnnotationTypeMappings.java:159) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.core.annotation.TypeMappedAnnotation.of(TypeMappedAnnotation.java:618) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.core.annotation.MergedAnnotation.of(MergedAnnotation.java:612) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.core.type.classreading.MergedAnnotationReadingVisitor.visitEnd(MergedAnnotationReadingVisitor.java:98) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.asm.ClassReader.readElementValues(ClassReader.java:3010) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.asm.ClassReader.accept(ClassReader.java:610) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.asm.ClassReader.accept(ClassReader.java:426) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:122) ~[spring-core-6.0.11.jar!/:6.0.11]
	at org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypesScanner.scanPackage(PersistenceManagedTypesScanner.java:113) ~[spring-orm-6.0.9.jar!/:6.0.9]
	at org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypesScanner.scan(PersistenceManagedTypesScanner.java:90) ~[spring-orm-6.0.9.jar!/:6.0.9]
	at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.buildDefaultPersistenceUnitInfo(DefaultPersistenceUnitManager.java:530) ~[spring-orm-6.0.9.jar!/:6.0.9]
	at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.readPersistenceUnitInfos(DefaultPersistenceUnitManager.java:508) ~[spring-orm-6.0.9.jar!/:6.0.9]
	at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:445) ~[spring-orm-6.0.9.jar!/:6.0.9]
	at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:429) ~[spring-orm-6.0.9.jar!/:6.0.9]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:339) ~[spring-orm-6.0.9.jar!/:6.0.9]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1817) ~[spring-beans-6.0.11.jar!/:6.0.11]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1766) ~[spring-beans-6.0.11.jar!/:6.0.11]
	... 24 common frames omitted

麻烦提供一下全部log?

spring.log (24.9 KB)

这个类 timescaledbEntityManagerFactory 的注解发一下?

就是jmix studio自动创建的一个类

package com.hetan.heating;

import io.jmix.core.JmixModules;
import io.jmix.core.Resources;
import io.jmix.data.impl.JmixEntityManagerFactoryBean;
import io.jmix.data.impl.JmixTransactionManager;
import io.jmix.data.persistence.DbmsSpecifics;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import jakarta.persistence.EntityManagerFactory;

import javax.sql.DataSource;

@Configuration
public class TimescaledbStoreConfiguration {

    @Bean
    @ConfigurationProperties("timescaledb.datasource")
    DataSourceProperties timescaledbDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "timescaledb.datasource.hikari")
    DataSource timescaledbDataSource(@Qualifier("timescaledbDataSourceProperties") DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().build();
    }

    @Bean
    LocalContainerEntityManagerFactoryBean timescaledbEntityManagerFactory(
            @Qualifier("timescaledbDataSource") DataSource dataSource,
            JpaVendorAdapter jpaVendorAdapter,
            DbmsSpecifics dbmsSpecifics,
            JmixModules jmixModules,
            Resources resources
    ) {
        return new JmixEntityManagerFactoryBean("timescaledb", dataSource, jpaVendorAdapter, dbmsSpecifics, jmixModules, resources);
    }

    @Bean
    JpaTransactionManager timescaledbTransactionManager(@Qualifier("timescaledbEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JmixTransactionManager("timescaledb", entityManagerFactory);
    }
}

好的,那可能跟这个类本身关系不大。我搜了一下,好像跟依赖的库有关系。build.gradle 里面的依赖库有添加或删除过什么吗?

这个真的是太难找问题了,idea运行没问题,要说哪个依赖有问题,日志就那么一点,崩溃啊

用的Jmix哪个版本?

最新的2.0.2

应该是运行时的jar依赖有问题。可以试试:

新建一个全新的jmix项目,构建jar后,用 JD-GUI 看一下 BOOT-INF/lib 下依赖的jar版本与你出问题的这个比较下,特别是Eclipselink和spring-jdbc,看看版本是否跟新项目一致,我看你出的问题是跟数据存储有关。

image

发现这个demo 本地也跑不起来,报的错是一样的,可以麻烦帮忙看下么
image

rest-server.zip (121.2 KB)

看报警说没有找到timescaledb的 persistence.xml,你在这个datasource上建一个entity就可以了。不知道是不是bug

我觉得,这就该是一个bug :cold_face:

1 个赞

我重建了一个新项目,添加一个额外HSQLDB数据源,没有报错,可能还有别的问题

额,我早上也是用studio建了一个全新的,然后加了额外的数据库就跑不起来,有点玄学~