为什么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。 然而,它们是元数据生成( 参考 )所必需的。 为了不破坏不使用元数据生成的人的事情,他们将依赖关系添加为测试依赖关系。 如果您正在使用元数据生成,则需要获取这些依赖项。