使用Tomcat和gradle进行Hibernate

免责声明:我是Java新手。 我正在尝试使用Tomcat和Gradle设置Hibernate。 构建运行正常,但看起来不会读取persistence.xml文件

我的项目结构如下:

 ├── build.gradle └── src └── main ├── java │  └── com │  └── test │  ├── domain │  │  └── Person.java │  └── web │  └── EventManagerServlet.java └── webapp ├── META-INF │  └── web.xml └── WEB-INF └── classes └── persistence.xml 

build.gradle文件的内容:

 apply plugin: 'java' apply plugin: 'idea' apply plugin: 'tomcat' apply plugin: 'war' sourceCompatibility = 1.5 version = '1.0' repositories { mavenCentral() } buildscript { repositories { jcenter() } dependencies { classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:1.2.3' } } dependencies { compile 'javax.servlet:javax.servlet-api:3.0.1' compile group: 'org.hibernate', name: 'hibernate-core', version: '4.3.5.Final' compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.13' def tomcatVersion = '7.0.11' 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' } } war { webXml = file('src/main/webapp/META-INF/web.xml') } 

EventManagerServlet类:

 package com.test.web; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; public class EventManagerServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("com"); EntityManager entityManager = entityManagerFactory.createEntityManager(); } } 

persistence.xml文件:

   org.hibernate.ejb.HibernatePersistence com.test.domain.Person   com.mysql.jdbc.Driver  jdbc:mysql://localhost:3306/hibernate root hibernate org.hibernate.dialect.MySQLDialect          

当我运行./gradlew tomcatRunWar --stacktrace ,服务器在http://localhost:8080/play上运行,但是当我尝试访问该页面时,出现以下exception:

 Servlet.service() for servlet [Event Manager] in context with path [/play] threw exception javax.persistence.PersistenceException: No Persistence provider for EntityManager named com at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) 

战争目录结构:

 ├── META-INF │  ├── MANIFEST.MF │  └── web.xml └── WEB-INF ├── classes │  ├── com │  │  └── test │  │  ├── domain │  │  │  └── Person.class │  │  └── web │  │  └── EventManagerServlet.class │  └── persistence.xml ├── lib │  ├── antlr-2.7.7.jar │  ├── dom4j-1.6.1.jar │  ├── hibernate-commons-annotations-4.0.4.Final.jar │  ├── hibernate-core-4.3.5.Final.jar │  ├── hibernate-jpa-2.1-api-1.0.0.Final.jar │  ├── jandex-1.1.0.Final.jar │  ├── javassist-3.18.1-GA.jar │  ├── javax.servlet-api-3.0.1.jar │  ├── jboss-logging-3.1.3.GA.jar │  ├── jboss-logging-annotations-1.2.0.Beta1.jar │  ├── jboss-transaction-api_1.2_spec-1.0.0.Final.jar │  ├── mysql-connector-java-5.1.13.jar │  └── xml-apis-1.0.b2.jar └── web.xml 

编辑

我不得不在build.gradle添加

 classpath 'org.hibernate:hibernate-entitymanager:4.1.7.Final' 

persistence.xml文件需要进入War的WEB-INF/classes/META-INF/目录。 实现此目的的最佳方法是将其放入src/main/resources/META-INF/ 。 如果你也想让它在测试中运行(运行类目录而不是Jar或War),你还需要配置:

 sourceSets.all { output.resourcesDir = output.classesDir } 

上面的配置是必需的,因为JPA希望在同一个类目录或归档中找到persistence.xml文件和相应的实体类,但Gradle默认使用不同的类和资源输出目录。

PS:我假设main目录在src下,而不是src的兄弟,如第一张图所示。