使用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
的兄弟,如第一张图所示。