我正在用Hibernate开发一个简单的示例,在任何容器外使用它。我正在使用Maven,因此配置了JBoss存储库(请参阅https://community.jboss.org/wiki/MavenGettingStarted- Users),并将以下依赖项添加到我项目的POM中:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.0.CR1</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.170</version> </dependency>
然后,我将Hibernate配置为使用H2数据库(文件hibernate.cfg.xml):
<?xml version='1.0' encoding='utf-8'?> <hibernate-configuration xmlns="http://www.hibernate.org/xsd/hibernate-configuration"> <session-factory> <property name="hibernate.connection.driver_class">org.h2.Driver</property> <property name="hibernate.connection.url">jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password"></property> <property name="hibernate.connection.pool_size">1</property> <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property> <property name="hibernate.cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration>
最后,我为一个简单的联系人类创建了一个POJO,如下所示:
@Entity public class Contact { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Basic private String name; @Basic private String email; /* Getters and setters omitted for brevity. */ }
最后,我创建了一个获取会话工厂,会话并最终保留实体的类。代码如下:
ServiceRegistry registry = new ServiceRegistryBuilder().configure().buildServiceRegistry(); MetadataSources sources = new MetadataSources(registry); sources.addAnnotatedClass(Contact.class); Metadata metadata = sources.buildMetadata(); sessionFactory = metadata.buildSessionFactory(); Contact contact = new Contact(); /* Set some attributes. */ Session session = sessionFactory.openSession(); session.save(contact); session.close();
当我运行此代码时,这是我得到的:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/jandex/Indexer at org.hibernate.metamodel.source.annotations.AnnotationMetadataSourceProcessorImpl.prepare(AnnotationMetadataSourceProcessorImpl.java:78) at org.hibernate.metamodel.source.internal.MetadataImpl.prepare(MetadataImpl.java:177) at org.hibernate.metamodel.source.internal.MetadataImpl.<init>(MetadataImpl.java:162) at org.hibernate.metamodel.source.internal.MetadataBuilderImpl.buildMetadata(MetadataBuilderImpl.java:83) at org.hibernate.metamodel.MetadataSources.buildMetadata(MetadataSources.java:112)
研究org.hibernate/hibernate-core我添加到项目中的依赖项的POM ,可以看到它依赖于org.jboss/jandex 1.0.3.Final。满足这种依赖性,我现在得到了NoClassDefFoundError: com/fasterxml/classmate/TypeResolver。回到Hibernate的POM,取决于com.fasterxml/classmate 0.5.4。我的项目中也满足了这种依赖性,我终于可以在没有任何代码的情况下执行代码了NoClassDefFoundError。
org.hibernate/hibernate-core
org.jboss/jandex 1.0.3.Final
NoClassDefFoundError: com/fasterxml/classmate/TypeResolver
com.fasterxml/classmate 0.5.4
NoClassDefFoundError
在Hibernate的POM中,jandex和classmate都定义为test依赖项,这就是为什么Maven的传递依赖项解析功能不会将它们自动添加到我的项目中的原因。但是,为什么在运行我的简单代码时需要它们?我究竟做错了什么?
test
在此先感谢您提供任何指导。-维托
主要的Hibernate功能不需要Jandex和Classmate。但是,它们是元数据生成所必需的(参考)。为了不破坏那些不使用元数据生成的人,他们将依赖项添加为测试依赖项。如果您正在使用元数据生成,则需要获取那些依赖项。