[
https://jira.codehaus.org/browse/MGWT-325?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Matthias Langer updated MGWT-325:
---------------------------------
Attachment: Added-a-workaround-for-MGWT325.patch
I've hacked together a workaround you might want to take a look at, that might
be the basis of an actual fix for this rather anoing bug. With this patch JARS
from WEB-INF/lib are *not* added to the system classpath, except for log4j (as
this seems to be needed for some reason).
> 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: Added-a-workaround-for-MGWT325.patch,
> 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