GWT + IntelliJ Idea - 添加服务器端库

GWT + IntelliJ Idea - adding a server side library

我正在尝试在 IntelliJ Idea 15 中实施 GWT 项目。我对 GWT 及其超级开发模式没有任何问题(至少是显而易见的)- 我可以 运行 一个应用程序并使用它。我可以进行 RPC 调用。

但是,现在我正在尝试添加 JPA/Hibernate 支持以使用数据库。在这里我遇到了麻烦。在该项目中,我有一个 GWT 方面 (2.6.1)、一个 JPA 方面(使用 hibernate 实现)和一个 Web 方面(用于 Web DD)。使用 Open Module Settings -> Libraries -> New Project Library 我添加了 gwt-servlet.jar,并使用 maven(它不是一个 maven 项目,只是使用 Idea 的特性)库:c3p0:c3p0:0.9.1.2org.hibernate:hibernate-entitymanager:5.0.3.Finalorg.postgresql:postgresql:9.3-1101-jdbc41 ;这就是配置。

使用此持久性单元属性(摘录):

                <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>

                <property name="hibernate.c3p0.min_size" value="5" />
                <property name="hibernate.c3p0.max_size" value="20" />
                <property name="hibernate.c3p0.timeout" value="300" />
                <property name="hibernate.c3p0.max_statements" value="50" />
                <property name="hibernate.c3p0.idle_test_period" value="3000" />

在 GWT RPC servlet 中,我尝试创建 EntityManager 实例:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("ThreatPersistenceUnit");
EntityManager em = emf.createEntityManager();
Query query = em.createQuery("SELECT a FROM Asset a");
...

但是当我尝试使用默认 GWT 运行 配置(Jetty)在 IDEA 中 运行 它时,出现以下异常:

javax.persistence.PersistenceException: Unable to build entity manager factory

引起
Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.postgresql.Driver

此外,在异常发生之前我收到以下警告: 警告:HHH000022:遇到了 c3p0 属性,但在 class 路径上找不到 c3p0 提供程序 class;这些属性将被忽略。

所以服务器似乎无法同时看到 c3p0 和 postgre jdbc 驱动程序。

我试过google,我发现最接近的problem/solution是这个SO answer。我已将库放入项目和工件中。但是,我不确定 Jetty lib 的回复者是什么意思。如果我只使用 GWT 的默认服务器,我在哪里可以找到 Jetty 安装?

另外,对我来说似乎很奇怪的是,在我遇到类似的问题之前(我不记得它是否正是 ClassNotFoundException)我能够通过添加 gwt-servlet.jar 到库 - 为什么添加这些其他库没有帮助?至少看起来它与休眠没有任何问题,因为它提供了警告等等。

好吧,尽管这是一个愚蠢的错误,也许将来有一天会有其他人做到,所以为了将来参考,这是这个问题:

我将项目的SDK和源码版本设置为1.6; hibernate 和其他库似乎是在相同或更低版本中编译的。但是,postgre 驱动程序是使用较新版本编译的 - 当我将源版本设置为 1.7 并将 Java 8 SDK 设置为 SDK 时,程序因一些不同的异常而崩溃(但那是由于我的编程错误 - 无关)。只有在我尝试(完全绝望)在代码中手动创建驱动程序的新对象(而不是将创建委托给持久性提供程序)之后我才发现这一点 - 然后我得到了主要的次要版本异常并且我知道什么是问题。