Java 由于扫描 <jar-file> 时出错,因此创建 entityManagerFactory 时出错
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24281235/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Error creating entityManagerFactory due to error tying to scan <jar-file>
提问by Chad
I am following http://spring.io/guides/tutorials/data/3; I am not sure what I did wrong, but I keep on getting exceptions that I don't understand. I tried searching for questions with the same exceptions to no avail.
我正在关注http://spring.io/guides/tutorials/data/3;我不确定我做错了什么,但我不断收到我不理解的异常。我尝试搜索具有相同例外情况的问题,但无济于事。
Stack trace:http://pastebin.com/WYPqS6da
堆栈跟踪: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:
构建.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.Hymanson.core:Hymanson-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 = ''
Stacktrace:
堆栈跟踪:
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)
I hope someone could point me to the right source, or help me in this predicament.
我希望有人能指出我正确的来源,或者帮助我解决这个困境。
采纳答案by Steve
The error:
错误:
invalid constant type: 18
Indicates that you have built the Jars with Java 8, but are attempting to run the application in a lower version.
表示您已使用 Java 8 构建了 Jars,但正在尝试以较低版本运行该应用程序。
From what I have seen elsewhere, you probably need to switch to a newer version of javassist (which is raising the error), as the version you are using is not compatible with Java 8.
从我在其他地方看到的情况来看,您可能需要切换到较新版本的 javassist(这会引发错误),因为您使用的版本与 Java 8 不兼容。
回答by win_wave
You do not need to provide beans for EntityManagerFactory and EntityManager. Just provide a bean LocalContainerEntityManagerFactoryBean
您不需要为 EntityManagerFactory 和 EntityManager 提供 bean。只需提供一个 bean LocalContainerEntityManagerFactoryBean
回答by Igor Baiborodine
I had the same problem while migrating one of my projects to Java 8. Fixed it by updating the hibernate-entitymanager artifact version from 4.2.0.Final to 4.3.8.Final.
我在将我的一个项目迁移到 Java 8 时遇到了同样的问题。通过将 hibernate-entitymanager 工件版本从 4.2.0.Final 更新到 4.3.8.Final 来修复它。
回答by Josiel Novaes
First, get the version of javassist
that works with Java 8:
首先,获取javassist
适用于 Java 8的版本:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
If you use maven, exclude all others javassist
dependencies:
如果您使用 maven,请排除所有其他javassist
依赖项:
`<exclusions>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>org.javassist</groupId>
</exclusion>
</exclusions>`
回答by gmode
I had similar issue. My problem was that I had another dependency (in my case jboss weld) that used different version of javassist. Excluding did not help.
我有类似的问题。我的问题是我有另一个依赖项(在我的例子中是 jboss 焊缝),它使用了不同版本的 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>
So, above exclusion does not work. I had to find a workaround for jboss weld.
因此,上述排除不起作用。我不得不为 jboss 焊接找到一个解决方法。
回答by Akvel
If you use 3.6.10-Final you need exclude javassist (without org.prefix)
如果您使用 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>