springboot打包entityManagerFactory报错 以及运行jar出现的java.lang.NoClassDefFoundError:javax/xml/bind/JAXBExcep

今天打包一个springboot的小demo 出现了一些问题

entityManagerFactory报错

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in class path resource [org/springframework/boot/autoconfigure

/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/SystemException

这是自动配置entityManagerFactory组件出错 因为了解springboot自动配置,所以下意识的想去找自动配置

@Configuration
@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManager.class })
@Conditional(HibernateEntityManagerCondition.class)
@EnableConfigurationProperties(JpaProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class })
@Import(HibernateJpaConfiguration.class)
public class HibernateJpaAutoConfiguration {

找到了这个报错的东西 点进去看他报错的初始化方法

public HibernateJpaConfiguration(DataSource dataSource, JpaProperties jpaProperties,
      ObjectProvider<JtaTransactionManager> jtaTransactionManager,
      ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers,
      ObjectProvider<Collection<DataSourcePoolMetadataProvider>> metadataProviders,
      ObjectProvider<List<SchemaManagementProvider>> providers,
      ObjectProvider<PhysicalNamingStrategy> physicalNamingStrategy,
      ObjectProvider<ImplicitNamingStrategy> implicitNamingStrategy,
      ObjectProvider<List<HibernatePropertiesCustomizer>> hibernatePropertiesCustomizers) {
   super(dataSource, jpaProperties, jtaTransactionManager,
         transactionManagerCustomizers);
   this.defaultDdlAutoProvider = new HibernateDefaultDdlAutoProvider(
         providers.getIfAvailable(Collections::emptyList));
   this.poolMetadataProvider = new CompositeDataSourcePoolMetadataProvider(
         metadataProviders.getIfAvailable());
   this.physicalNamingStrategy = physicalNamingStrategy.getIfAvailable();
   this.implicitNamingStrategy = implicitNamingStrategy.getIfAvailable();
   this.hibernatePropertiesCustomizers = hibernatePropertiesCustomizers
         .getIfAvailable(() -> Collections.emptyList());
}

既然来都来了就看一下怎么自动配置hibernate的把

查看父类JpaBaseConfiguration

@EnableConfigurationProperties(JpaProperties.class)
@Import(DataSourceInitializedPublisher.Registrar.class)
public abstract class JpaBaseConfiguration implements BeanFactoryAware {

重点也就上面两个注解@EnableConfigurationProperties 和@Import

@EnableConfigurationProperties(JpaProperties.class)点进去 就是一个绑定配置信息的类,把在配置文件中所有以spring.jpa配置前缀的绑定进来

@ConfigurationProperties(prefix = "spring.jpa")
public class JpaProperties {

@Import(DataSourceInitializedPublisher.Registrar.class)

registrar是DataSourceInitializedPublisher的一个内部类 很刺激,这类就是用来注册

DataSourceInitializedPublisher的

static class Registrar implements ImportBeanDefinitionRegistrar {

   private static final String BEAN_NAME = "dataSourceInitializedPublisher";

   @Override
   public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
         BeanDefinitionRegistry registry) {
      if (!registry.containsBeanDefinition(BEAN_NAME)) {
         GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
         beanDefinition.setBeanClass(DataSourceInitializedPublisher.class);
         beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
         // We don't need this one to be post processed otherwise it can cause a
         // cascade of bean instantiation that we would rather avoid.
         beanDefinition.setSynthetic(true);
         registry.registerBeanDefinition(BEAN_NAME, beanDefinition);
      }
   }
}

然后一直往父类或父接口往上查 发现最后实现的是 Aware接口,回过头发现问题还是尴尬的摆在那,于是动用通用的解决方法:检查pom依赖,检查plugin 删掉工程中test目录下的东西,删掉junit依赖 执行 mvn clean package打包成功

运行打包的jar报错

把上面的jar包拷出来 在命令行执行 java -jar 命令 出现spring boot启动页面

但是依旧报错

java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException

java.lang.NoClassDefFoundError:javax/xml/bind/annotation/XmlType

一看到这个就笑了,以前见到过这个,这是少了javax相关jar包导致的

添加相关依赖解决

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.12</version>
</dependency>

然后去大佬的博客查找原因 大概是jdk版本引起的问题

我maven 执行的jdk 1.8版本 但是我系统配置的是 jdk 1.9

完美解决

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 这个错误是Java程序在运行时找不到javax.persistence.entitymanagerfactory类所引起的。这个类通常是在Java Persistence API (JPA)中使用的,它提供了一种持久化数据的方式。这个错误通常是由于缺少相关的JAR包或者类路径不正确所引起的。要解决这个问题,可以尝试添加相关的JAR包到程序的类路径中,或者检查类路径是否正确设置。 ### 回答2: 这个错误提示是 Java 程序中常见的错误之一,通常会发生在使用 Hibernate 框架时。它的原因是因为程序缺少必要的类库,无法找到 javax.persistence.EntityManagerFactory 这个类。这个类是 Java Persistence API(JPA)的一部分,通过它可以创建 EntityManager 对象管理实体对象。 这个错误通常在以下情况下发生: 1. 缺少依赖:程序的类路径中没有包含必要的类库或者包含的类库版本过低。可以检查相关的依赖配置,添加必要的类库。 2. 类名错误:类名和包名拼写错误或大小写不一致。可以检查相关的类名和包名是否正确。 3. 程序冲突:程序中使用了不同版本的类库导致冲突。可以检查程序中所有使用到的类库版本,尽量使用同一个版本。 4. 类库路径错误:类库的路径设置错误,程序无法找到相关的类库。可以检查程序的类路径配置是否正确。 针对这些原因,我们可以采取以下措施解决这个问题: 1. 添加缺少的依赖:检查程序中使用到的类库依赖,添加缺少的类库或者更新版本。可以使用 Maven、Gradle 等工具管理依赖。 2. 修改类名和包名:检查相关的类名和包名,确保拼写和大小写都正确。 3. 解决类库冲突:检查程序中所有使用到的类库版本,使用同一个版本。可以使用 Maven、Gradle 等工具管理依赖,并对相关的依赖进行冲突解决。 4. 修改类库路径:检查程序的类路径配置是否正确,确保程序能够找到相关的类库。 综上所述,java.lang.NoClassDefFoundError: javax/persistence/EntityManagerFactory 错误通常是由于缺少必要的类库或者类库冲突所导致的。如果发生这个错误,需要仔细分析错误的原因,并采取相应的措施进行解决。 ### 回答3: Java.lang.NoClassDefFoundError: javax/persistence/EntityManagerFactory 是一个 Java 错误,它指出在运行时的类路径中找不到 javax.persistence.EntityManagerFactory 类。 javax.persistence 包属于 Java Persistence API(JPA)规范,是 Java 持久化层的一部分,而 EntityManagerFactory 则是 JPA 的一个核心接口,负责创建和管理 EntityManager 对象。在使用 JPA 进行对象关系映射时,我们需要引用 javax.persistence 包并使用其中的类和接口。 出现该错误的原因有很多,比如: 1.类路径问题:如果项目运行所需的 jar 包或类库没有正确配置到类路径中,就会导致 JVM 在运行时找不到对应的类或接口。 2.版本不兼容:如果项目中使用的 javax.persistence 包与 Java 编译器版本不兼容,也会报出该错误。比如使用 JDK 1.8 编译的代码运行在 JRE 1.7 上,就可能会出现该问题。 3.缺少依赖:在项目构建和部署过程中,如果遗漏了某些依赖包或库文件,就可能会导致运行时找不到相关的类或接口。 为了解决这个问题,我们可以尝试以下几个步骤: 1.检查类路径:首先,我们需要检查项目的类路径,确保所有需要的 jar 包或类库都正确配置到其中。可以使用 Eclipse、Intellij IDEA 等工具查看和修改项目的类路径。 2.更新依赖:有时候我们可能需要更新项目中的某些依赖,比如更新 JPA 的版本或升级相关的库文件。可以使用 Maven 等构建工具自动管理依赖,或手动下载并替换相关的 jar 包。 3.检查 Java 版本:如果出现版本不兼容的问题,可以尝试升级 Java 编译器或降低项目的 JRE 版本。 4.打包方式:最后,如果我们是使用 jar 包进行项目部署,在创建 jar 包时需要将依赖的 jar打包进去。可以使用 Maven 的 shade 插件或使用 Eclipse 的导出功能来打包项目。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值