当前位置: 首页 > 面试题库 >

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

况野
2023-03-14
问题内容

我正在用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

在Hibernate的POM中,jandex和classmate都定义为test依赖项,这就是为什么Maven的传递依赖项解析功能不会将它们自动添加到我的项目中的原因。但是,为什么在运行我的简单代码时需要它们?我究竟做错了什么?

在此先感谢您提供任何指导。-维托


问题答案:

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



 类似资料:
  • 问题内容: Angular对于构建单页应用程序非常有用。它基本上建立在当前范例上,在该范例中我们向不同的端点发出请求,以帮助我们创建更好的单页应用程序。 另一方面,我们拥有的Meteor似乎更加强大,特别是因为它们具有称为DDP的功能,该功能基本上允许双向数据流。看来Meteor是Angular的超集,并且显然是更好的选择。 尽管Angular确实提供了一些诸如测试和本地化之类的功能,但我只是不明

  • 我有以下html: 我试图获得如下范围: 但我收到:。 我是angularJS初学者,我只是不明白为什么这不起作用。 更新:这也不起作用: 更新2:我试图在控制台中打印出作用域的所有代码:

  • A/B测试用于根据数据导出的结果做出业务决策,而不是仅仅进行预测。 它允许您创建您的网站或应用程序的变体,然后帮助您确认或放弃您做出更改的决定。 通过此测试,可以优化您的网站或应用,从而提高转化率。 更高的转化率意味着从现有用户中获得更多价值,而不必花费更多流量获取。 A/B测试还可以帮助您改变业务中的其他因素,如改变工作文化等。它可以帮助您使用数学数据和统计数据来确定产品变化的方向。 无论您是设

  • 问题内容: 我对代码块或“作用域”的定义感到困惑。苹果公司的守卫文档说了这一点:守卫声明的else块… “必须转移控制权以退出其中出现保护声明的代码块。” 其他在线消息来源说,警卫声明必须退出其存在的“范围”。 因此,请看下面的示例代码: 根据我目前对“范围”的理解,代码 创建一个新范围,即{}之间。鉴于此假设,后卫只会逃避这一范围。但事实并非如此。在这种情况下,无论是否将其埋在if子句中,gua

  • 问题内容: 我试图了解是什么使并发锁如此重要,如果可以使用的话。在下面的虚拟代码中,我可以执行以下任一操作: 同步了整个方法或同步了易受攻击的区域() 或使用ReentrantLock锁定易受攻击的代码区域。 码: 问题答案: 一个ReentrantLock的是非结构化的,不像结构-即你不需要使用块结构锁,甚至可以举行跨越方法的锁。一个例子: 这样的流程不可能通过构造中的单个监视器来表示。 除此之

  • 问题内容: 也许我的问题是新手,但是我真的无法理解在什么情况下使用junit? 无论是编写简单的应用程序还是大型应用程序,我都使用语句对其进行测试,这对我来说很容易。 如果仍然需要调用相同的方法,检查它们返回的内容,然后又要为所有内容添加注释,那么为什么要使用JUnit创建测试类,在项目中创建不必要的文件夹呢? 为什么不编写一个类并立即对其进行测试而不创建Test-class? PS。我从未在刚刚