2016-07-25 15 views
2

Wir haben eine Anwendung Multi-Projekt zu finden, die unter ausgeführt wird: Maven, Feder 4.2.7, Feder-data-JPA 1.10.2, Hibernate 5.1Schattige Paket versucht java.time.LocalTime in Java 7

Alles läuft gut, wenn man durch die Sonnenfinsternis läuft, aber sobald wir versuchen, in ein einzelnes Glas einzutauchen, scheint Hibernate zu denken, dass wir in Java 8 sind und nach java.time.LocalTime suchen.

  • Keine Verwendung der API Java 8 Zeit
  • ist
  • Alles durch ganze Anwendung macht das threetenbp Paket konfiguriert laufen durch Java 7 (in pom-Dateien, Konsole, Eclipse)
  • Ich habe versucht, mit die packageToScan Einspritzung auf der EntityManager ohne Erfolg

Stapelüberwachung:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [jar:file:....jar!/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.TypeNotPresentException: Type java.time.LocalTime not present 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at com.gvh.dsn.ficheParametrage.Main.main(Main.java:66) 
Caused by: java.lang.TypeNotPresentException: Type java.time.LocalTime not present 
    at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117) 
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125) 
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) 
    at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68) 
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138) 
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) 
    at sun.reflect.generics.repository.ClassRepository.getSuperInterfaces(ClassRepository.java:100) 
    at java.lang.Class.getGenericInterfaces(Class.java:819) 
    at org.hibernate.cfg.AttributeConverterDefinition.extractAttributeConverterParameterizedType(AttributeConverterDefinition.java:157) 
    at org.hibernate.cfg.AttributeConverterDefinition.<init>(AttributeConverterDefinition.java:114) 
    at org.hibernate.cfg.AttributeConverterDefinition.from(AttributeConverterDefinition.java:93) 
    at org.hibernate.cfg.AttributeConverterDefinition.from(AttributeConverterDefinition.java:73) 
    at org.hibernate.boot.model.process.internal.ScanningCoordinator.applyScanResultsToManagedResources(ScanningCoordinator.java:234) 
    at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:81) 
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:200) 
    at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:34) 
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:165) 
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:160) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135) 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:50) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    ... 12 more 
Caused by: java.lang.ClassNotFoundException: java.time.LocalTime 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:274) 
    at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) 
    ... 36 more 

Maven Schatten config:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.3</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>${mainClass}</mainClass> 
        </transformer> 
        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/spring.handlers</resource> 
        </transformer> 
        <transformer 
         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/spring.schemas</resource> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Hier ist meine Application:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
          http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd 
          http://www.springframework.org/schema/context http://www.springframework.org/schema/task/spring-context-3.0.xsd"> 

    <context:annotation-config /> 

    <context:component-scan base-package="..." /> 

    <bean id="myContactDataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="..." /> 
     <property name="username" value="..." /> 
     <property name="password" value="..." /> 
     <property name="initialSize" value="1" /> 
     <property name="maxActive" value="20" /> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" /> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 
    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" /> 
     <property name="dataSource" ref="myContactDataSource" /> 
     <property name="persistenceUnitName" value="dalPU" /> 
     <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> 
    </bean> 

    <jpa:repositories base-package="dal.repository" 
     entity-manager-factory-ref="entityManagerFactory" 
     transaction-manager-ref="transactionManager" /> 
</beans> 

Was bin ich?

UPDATE

Wie in den Kommentaren

aggregierte POM

angefordert

<dependencies> 

    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.2.7.RELEASE</version> 
     <exclusions> 
      <exclusion> 
       <groupId>commons-logging</groupId> 
       <artifactId>commons-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>4.2.7.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>4.2.7.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>4.2.7.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>4.2.7.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-jpa</artifactId> 
     <version>1.10.2.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>2.2</version> 
    </dependency> 

    <!-- Utils --> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.4</version> 
    </dependency> 

    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>5.1.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.1-901-1.jdbc4</version> 
    </dependency> 

    <!-- slf4j/log4j2 : Log --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.21</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.6.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.6.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.6.2</version> 
    </dependency> 



    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.8.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.8.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.0</version> 
    </dependency> 

</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.2.1</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>java</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <mainClass>${mainClass}</mainClass> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>${mainClass}</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.handlers</resource> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.schemas</resource> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

'java.time.LocalTime' wird in Java-8 eingeführt – sidgate

+0

Yeah und deshalb verstehe ich nicht, warum es danach sucht. Die Pakete sind nicht einmal kompatibel mit Java 8 und alles ist so eingestellt, dass es unter Java 7 läuft. Wir verwenden das Paket 'java.time' nirgends. –

+0

Es sieht aus, wenn Ihre applicationContext.xml versucht, eine Bean mit diesem zu initialisieren ...? – khmarbaise

Antwort

1

Sieht aus wie Hibernate einige Classpath Scan tut und einige Klassen zu finden, die die fehlende Java 8 Zeit API-Referenz. Zumindest einige der Klassendateien in Ihrem Klassenpfad enthalten Verweise auf Java 8-Zeittypen.Verwenden Sie Ihre pom und tun:

mvn dependency:unpack-dependencies

gefolgt von:

grep -R java.time.LocalTime target/dependency | perl -p -e 's#Binary file target/dependency/(.*)\.class.*#$1#'

Ich kam mit dieser Liste von Sachen auf Ihrem Classpath up, die die Java 8 Mal API-Referenzen:

org/springframework/data/jpa/convert/threeten/Jsr310JpaConverters$LocalTimeConverter 
org/springframework/data/convert/Jsr310Converters$DateToLocalTimeConverter 
org/springframework/data/convert/Jsr310Converters$LocalTimeToDateConverter 
org/springframework/data/convert/Jsr310Converters 
org/springframework/format/datetime/standard/TemporalAccessorParser 
org/springframework/format/datetime/standard/DateTimeConverters$LocalDateTimeToLocalTimeConverter 
org/springframework/format/datetime/standard/DateTimeConverters$ZonedDateTimeToLocalTimeConverter 
org/springframework/format/datetime/standard/DateTimeConverters$CalendarToLocalTimeConverter 
org/springframework/format/datetime/standard/DateTimeConverters$OffsetDateTimeToLocalTimeConverter 
org/springframework/format/datetime/standard/DateTimeFormatterRegistrar 
org/springframework/format/datetime/standard/Jsr310DateTimeFormatAnnotationFormatterFactory 

Das Zeug in org.springframework.format wird von Spring für Typkonvertierungen verwendet, ich glaube nicht, dass es jemals dich sed by Hibernate überhaupt. Meine Vermutung ist, dass die problematischen Pakete org.springframework.data.jpa.convert und org.springframework.data.jpa.convert.threeten sind.

Referenzieren Sie eines dieser Pakete oder Klassen direkt in Ihrer Konfiguration? Haben Sie versucht, Ihre @EntityScan oder @ComponentScan auf nur Pakete einzuschränken, die Ihren Code enthalten?

+0

Es war tatsächlich 'spring-data-jpa'-Version' 1.10.2', die Java-8-Zeit-API benötigte. Auf Version '1.7.4' downraded und es funktioniert! Vielen Dank. –

+0

Und um Ihre letzte Frage zu beantworten, ist der Fall, Frühling scannt nur Pakete, wo unser eigener Code ist. –

0

ich ein einfaches Maven Projekt in IntelliJ IDEA erstellt haben und hinzugefügt alle Abhängigkeiten.

Dann habe ich die POMs geöffnet, die zu den Abhängigkeiten von Hibernate gehören.

Im POM von org.javassist:javassist:3.20.0-GA ich dies gefunden:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.2</version> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
     <testSource>1.8</testSource> 
     <testTarget>1.8</testTarget> 
     <compilerArgument>-parameters</compilerArgument> 
    </configuration> 
    </plugin> 

Ich denke, die Testquellen der Grund für das Problem sind. Wenn Sie die App in Eclipse ausführen, werden keine Tests durchgeführt. Aber wenn Sie mit Maven bauen, dann werden alle Tests ausgeführt (wenn Sie nicht den spezifischen Schalter verwenden Sie -DskipTests)

EDIT: vielleicht ... schnell die Quellen Javassist während Build nicht kompiliert.

0

Ihre Hibernate-Abhängigkeit hat eine Methode, die darauf beruht, die Ihnen den Fehler gibt.

Zusätzlich hibernate- EntityManager ist veraltet und ersetzt durch Hibernate-Core