org java hibernate classmate

java - org - ¿Por qué Hibernate 4.2 usa jandex y classmate si su Maven POM los define como ámbito de prueba?



org hibernate hibernate (1)

Jandex y Classmate no son necesarios para la funcionalidad principal de Hibernate. Sin embargo, se requieren para la generación de metadatos ( referencia ). Para no romper las cosas para las personas que no usan la generación de metadatos, agregaron las dependencias como dependencias de prueba. Si está utilizando la generación de metadatos, necesitará obtener esas dependencias.

Estoy desarrollando un ejemplo simple con Hibernate, usándolo fuera de cualquier contenedor. Estoy usando Maven y, por lo tanto, configuré el repositorio de JBoss (consulte https://community.jboss.org/wiki/MavenGettingStarted-Users ) y agregué las siguientes dependencias al POM de mi proyecto:

<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>

Luego procedí a configurar Hibernate para usar una base de datos H2 como esta (archivo 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>

Finalmente, creé un POJO para una clase de contacto simple, como se muestra a continuación:

@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. */ }

Finalmente, creé una clase que obtiene una fábrica de sesiones, una sesión y finalmente persiste una entidad. El código es el siguiente:

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();

Cuando ejecuto este código, esto es lo que obtengo:

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)

Investigando el POM de la org.hibernate/hibernate-core que agregué a mi proyecto, puedo ver que depende de org.jboss/jandex 1.0.3.Final . Satisfaciendo esa dependencia, obtengo ahora un NoClassDefFoundError: com/fasterxml/classmate/TypeResolver . De vuelta al POM de Hibernate, depende de com.fasterxml/classmate 0.5.4 . Satisfaciendo esa dependencia también en mi proyecto, finalmente puedo ejecutar el código sin ningún NoClassDefFoundError s.

En el POM de Hibernate, tanto jandex como classmate se definen como dependencias de test , y es por eso que no se agregan automáticamente a mi proyecto mediante la función de resolución de dependencia transitiva de Maven. Sin embargo, ¿por qué se requieren cuando ejecuto mi código simple? ¿Qué estoy haciendo mal?

De antemano, gracias por cualquier consejo. - Vítor