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


Reply via email to