Michael Nascimento Santos created MGWT-325:
----------------------------------------------
Summary: Jars included twice in classpath lead to
ClassCastExceptions
Key: MGWT-325
URL: https://jira.codehaus.org/browse/MGWT-325
Project: Maven 2.x GWT Plugin
Issue Type: Bug
Affects Versions: 2.4.0
Environment: GWT Release 2.4.0
Derby 10.8.2.2
hibernate-jpa-2.0-api 1.0.1.Final
hibernate-core 4.1.0.Final
hibernate-entitymanager 4.1.0.Final
Reporter: Michael Nascimento Santos
Priority: Critical
Attachments: RequestFactoryTest.zip
Initially reported by Thalys Gomes at:
http://code.google.com/p/google-web-toolkit/issues/detail?id=7198
GWT Maven Plugin includes dependencies both in WEB-INF/lib and also in the JVM
execution classpath. This causes many common libraries and frameworks to fail
at runtime with ClassCastExceptions, such as the Hibernate problem described
below.
Trying to reproduce exactly the problem, we created a sample GWT application
with maven and with a ServletContextListener that is trying to read a JPA
persistence unit:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
You can reproduce this issue by doing the following:
Any connections you try to create with a JPA Persistence Unit with Hibernate
properties, configuring specific implementation classes on persistence.xml will
cause a ClassCastException to happen, such as setting the dialect. You can
reproduce this problem about ClassLoader of Hibernate
When running in hosted mode:
00:00:01,172 [WARN] Failed startup of context
com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload@11891189{/,C:\Development\Workspace\RequestFactoryTest\target\RequestFactoryTest-1.0-SNAPSHOT}
javax.persistence.PersistenceException: [PersistenceUnit: test] Unable to build
EntityManagerFactory
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
at
org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
at
com.test.gwt.server.listeners.UpDatabase.contextInitialized(UpDatabase.java:30)
at
org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:543)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at
org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220)
at
org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513)
at
org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
at
com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at
org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:222)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672)
at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
at com.google.gwt.dev.DevMode.main(DevMode.java:311)
Caused by: org.hibernate.HibernateException: Could not instantiate dialect class
at
org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:82)
at
org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64)
at
org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:170)
at
org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
at
org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
at
org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
at
org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71)
at
org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2273)
at
org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2269)
at
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1738)
at
org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:88)
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
at
org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
at
com.test.gwt.server.listeners.UpDatabase.contextInitialized(UpDatabase.java:30)
at
org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:543)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at
org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220)
at
org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513)
at
org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
at
com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at
org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:222)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672)
at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
at com.google.gwt.dev.DevMode.main(DevMode.java:311)
Caused by: java.lang.ClassCastException: org.hibernate.dialect.DerbyDialect
incompatible with org.hibernate.dialect.Dialect
at
org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:73)
at
org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64)
at
org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:170)
at
org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
at
org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
at
org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
at
org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71)
at
org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2273)
at
org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2269)
at
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1738)
at
org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:88)
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
at
org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
at
com.test.gwt.server.listeners.UpDatabase.contextInitialized(UpDatabase.java:30)
at
org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:543)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at
org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220)
at
org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513)
at
org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
at
com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at
org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:222)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at
com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672)
at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
at com.google.gwt.dev.DevMode.main(DevMode.java:311)
The problem occurs because the GWT Maven Plugin not only includes libraries in
WEB-INF/lib, but they are also included in the classpath for launching Jetty in
embedded mode. Therefore, when a library / framework / user code tries to load
a class using an arbitrary classloader, it might find the implementation in the
system classpath, causing the aforementioned problem.
Although this error could be easily demonstrated using plain JPA / Hibernate,
it can happen with any other framework. It is our understanding that libraries
that are not scoped provided should only be deployed to WEB-INF/lib and not be
added to the JVM classpath. On the other hand, libraries marked as provided
should be added to the JVM classpath only and shouldn't be deployed to Jetty
itself.
The code needed to reproduce the issue is attached.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email