为什么Hibernate 4.2使用jandex和classmate,如果它的Maven POM将它们定义为测试范围?
我正在用Hibernate开发一个简单的例子,在任何容器之外使用它。 我正在使用Maven,因此配置了JBoss存储库(请参阅https://community.jboss.org/wiki/MavenGettingStarted-Users )并将以下依赖项添加到我的项目的POM中:
org.hibernate hibernate-core 4.2.0.CR1 com.h2database h2 1.3.170
然后我继续配置Hibernate来使用像这样的H2数据库(文件hibernate.cfg.xml):
org.h2.Driver jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE sa 1 org.hibernate.dialect.H2Dialect org.hibernate.cache.internal.NoCacheProvider true update
最后,我为一个简单的联系人类创建了一个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.(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
的情况下执行代码。
在Hibernate的POM中,jandex和classmate都被定义为test
依赖项,这就是为什么它们不会通过Maven的传递依赖性解析function自动添加到我的项目中。 但是,为什么在运行简单代码时需要它们? 我究竟做错了什么?
提前感谢任何指针。 – Vítor
主要的Hibernatefunction不需要Jandex和Classmate。 然而,它们是元数据生成( 参考 )所必需的。 为了不破坏不使用元数据生成的人的事情,他们将依赖关系添加为测试依赖关系。 如果您正在使用元数据生成,则需要获取这些依赖项。