首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Hibernate 4.2使用jandex和classmate,如果它的Maven POM将它们定义为测试范围?

为什么Hibernate 4.2使用jandex和classmate,如果它的Maven POM将它们定义为测试范围?
EN

Stack Overflow用户
提问于 2013-03-02 07:07:33
回答 1查看 14.4K关注 0票数 3

我正在用Hibernate开发一个简单的例子,在任何容器之外使用它。我使用Maven,因此配置了JBoss存储库(参见https://community.jboss.org/wiki/MavenGettingStarted-Users),并将以下依赖项添加到我的项目的POM中:

代码语言:javascript
复制
<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):

代码语言:javascript
复制
<?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>

最后,我为一个简单的contact类创建了一个POJO,如下所示:

代码语言:javascript
复制
@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. */
}

最后,我创建了一个类,它获得一个会话工厂、一个会话并最终持久化一个实体。代码如下:

代码语言:javascript
复制
    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();

当我运行这段代码时,我得到的结果如下:

代码语言:javascript
复制
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的情况下执行代码了。

在Hibernate的POM中,jandex和classmate都被定义为test依赖项,这就是为什么它们不会通过Maven的传递依赖项解析特性自动添加到我的项目中。但是,当我运行我的简单代码时,为什么需要它们呢?我做错了什么?

提前感谢您的指点。-维克托

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-02 11:32:29

主要的Hibernate功能不需要Jandex和Classmate。但是,元数据生成(reference)需要它们。为了不破坏那些不使用元数据生成的人,他们添加了依赖项作为测试依赖项。如果您正在使用元数据生成,则需要获取这些依赖项。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15168365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档