Ошибка при создании EntityManagerFactory из-за ошибки привязки к scan

#java #spring #gradle

#java #весна #gradle

Вопрос:

Я следую http://spring.io/guides/tutorials/data/3 ; Я не уверен, что я сделал не так, но я продолжаю получать исключения, которые я не понимаю. Я пытался искать вопросы с теми же исключениями, но безрезультатно.

Трассировка стека:
http://pastebin.com/WYPqS6da

PersistenceConfig.java

 @Configuration
@EnableJpaRepositories
@EnableTransactionManagement
public class PersistenceConfig {

    @Bean
    public DataSource dataSource() throws SQLException {
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.HSQL).build();
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() throws SQLException {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.HSQL);
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.scrumster.persistence.domain");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();

        return factory.getObject();
    }

    @Bean
    public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws SQLException {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }
}
  

build.gradle:

 apply plugin: 'war'
apply plugin: 'tomcat'
apply plugin: 'java'
apply plugin: 'propdeps'
apply plugin: 'propdeps-maven'
apply plugin: 'propdeps-idea'
apply plugin: 'propdeps-eclipse'
apply plugin: 'eclipse'
apply plugin: 'idea'

buildscript {
  repositories {
    mavenCentral()
    maven {
      url "http://download.java.net/maven/2"
    }
    maven { url 'http://repo.spring.io/plugins-release' }
  }

  dependencies {
    classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.8'
    classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.1'
  }
}

repositories {
  mavenCentral()
  maven { url 'http://repo.spring.io/milestone/'}
}

dependencies {
    def tomcatVersion = '7.0.42'
    tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
            "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}"
    tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {
      exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj'
    }

    compile 'org.springframework:spring-webmvc:4.0.5.RELEASE'
    compile 'org.springframework.data:spring-data-jpa:1.3.4.RELEASE'
    compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final'
    compile 'org.hibernate:hibernate-entitymanager:4.0.1.Final'
    compile 'org.springframework.hateoas:spring-hateoas:0.7.0.RELEASE'
    compile 'com.jayway.jsonpath:json-path:0.8.1'

    compile 'org.springframework.security:spring-security-web:3.2.0.M2'
    compile 'org.springframework.security:spring-security-core:3.2.0.M2'
    compile 'org.springframework.security:spring-security-config:3.2.0.M2'

    compile 'org.slf4j:slf4j-api:1.7.5'
    runtime 'org.hsqldb:hsqldb:2.3.2'
    runtime 'org.slf4j:slf4j-jdk14:1.7.5'
    runtime 'com.fasterxml.jackson.core:jackson-databind:2.3.3'
    runtime 'javax.xml.bind:jaxb-api:2.2.9'

    provided 'javax.servlet:javax.servlet-api:3.0.1'

    testCompile 'com.jayway.jsonpath:json-path-assert:0.8.1'
    testCompile 'org.springframework:spring-test:4.0.5.RELEASE'
    testCompile 'junit:junit:4.11'
    testCompile "org.mockito:mockito-core:1.9.5"

}

task wrapper(type: Wrapper) {
    gradleVersion = '1.12'
}

tomcatRunWar.contextPath = ''
  

Трассировка стека:

 Caused by: java.lang.RuntimeException: Error while reading file:/E:/Files/Source/Workspace-Eclipse2/scrumster/bin/
        at org.hibernate.ejb.packaging.NativeScanner.getFilesInJar(NativeScanner.java:193)
        at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:503)
        at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:851)
        ... 58 more
Caused by: java.io.IOException: invalid constant type: 18
        at javassist.bytecode.ConstPool.readOne(ConstPool.java:1113)
        at javassist.bytecode.ConstPool.read(ConstPool.java:1056)
        at javassist.bytecode.ConstPool.<init>(ConstPool.java:150)
        at javassist.bytecode.ClassFile.read(ClassFile.java:765)
        at javassist.bytecode.ClassFile.<init>(ClassFile.java:109)
  

Я надеюсь, что кто-нибудь может указать мне правильный источник или помочь мне в этом затруднительном положении.

Ответ №1:

Ошибка:

 invalid constant type: 18
  

Указывает, что вы создали Jars с Java 8, но пытаетесь запустить приложение в более низкой версии.

Из того, что я видел в другом месте, вам, вероятно, нужно переключиться на более новую версию javassist (которая вызывает ошибку), поскольку используемая вами версия несовместима с Java 8.

Комментарии:

1. Смотрите мое дополнительное редактирование — проблема не столько в среде выполнения, сколько в том, что вы используете несовместимую библиотеку (javassist). Он выполняет манипуляции с байт-кодом, поэтому он более чувствителен к версиям JVM, чем большинство.

2. Я подозреваю, что это транзитивная зависимость, вызванная одной из зависимостей, найденных в вашем build.gradle. Я знаю, что Eclipse pom.xml редактор покажет, откуда взялись зависимости. К сожалению, я не очень часто использую Gradle, поэтому я не уверен, предоставляются ли подобные инструменты.

3. Я попытался снизить уровень соответствия проекта Java 7 (вместо обновления некоторых моих вещей), и у меня все еще не работает.

4. Та же ошибка? Предоставленная вами трассировка стека сообщает мне, что что-то E:/Files/Source/Workspace-Eclipse2/scrumster/bin/ было построено с использованием Java 8.

5. Кажется, преобразование его в Java 7 исправило проблему. Спасибо.

Ответ №2:

У меня была такая же проблема при переносе одного из моих проектов на Java 8. Исправлено путем обновления версии артефакта hibernate-entitymanager с 4.2.0.Final до 4.3.8.Final.

Ответ №3:

Если вы используете 3.6.10-Final, вам необходимо исключить javassist (без org.префикс)

     <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.6.10.Final</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>javassist</artifactId>
                    <groupId>javassist</groupId>
                </exclusion>
            </exclusions>
        </dependency>
       <!-- javassist with fixed https://issues.jboss.org/browse/JASSIST-174 -->
       <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.2-GA</version>
        </dependency>
  

Комментарии:

1. У меня работает с версией hibernate-entitymanager 3.6.0.Final . Спасибо!

Ответ №4:

Вам не нужно предоставлять компоненты для EntityManagerFactory и EntityManager. Просто укажите компонент LocalContainerEntityManagerFactoryBean

Комментарии:

1. Привет, я совсем новичок в Spring. Можете ли вы изложить свой ответ?

Ответ №5:

У меня была аналогичная проблема. Моя проблема заключалась в том, что у меня была другая зависимость (в моем случае jboss weld), которая использовала другую версию javassist. Исключение не помогло.

     <dependency>
        <groupId>org.jboss.weld</groupId>
        <artifactId>weld-se</artifactId>
        <version>1.0.1-Final</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <artifactId>javassist</artifactId>
                <groupId>org.javassist</groupId>
            </exclusion>
        </exclusions>
    </dependency>
  

Итак, приведенное выше исключение не работает. Мне пришлось найти обходной путь для jboss weld.