My JBoss extension can't see the database driver because of a classloader issue
fharms Jul 12, 2014 9:55 AMFirst a short description of what I trying to achieve. I have created my own JBoss7 extension where I hook into the PARSE_WEB_DEPLOYMENT phase and I want to create my own temp hibernate session for bootstrapping our database.
But for some reason Hibernate can’t see the postgrel driver because of a classloader issue. From what I can see it try to load the postgresql driver from the hibernate module, and it can’t see the postgrel driver of course.
I found a temp workaround where I define the hibernate and postgrel resource in the resources section instead, but I would prefer I could just depend on existing modules instead
<resources> <resource-root path="jboss-as-db-bootstrap-1.0.2.BETA.jar"/> <resource-root path="postgresql-9.1-903.jdbc4.jar"/> <resource-root path="hibernate-core-4.2.0.CR1.jar"/> <resource-root path="hibernate-commons-annotations-4.0.1.Final.jar"/> <!-- Insert resources here --> </resources>
I have tried many solution with no luck, so my question is how can archive this using the module.xml below.
<module xmlns="urn:jboss:module:1.1" name="org.jboss.as.extension.db_bootstrap"> <resources> <resource-root path="jboss-as-db-bootstrap-1.0.2.BETA.jar"/> </resources> <dependencies> <module name="javax.annotation.api"/> <module name="javax.api"/> <module name="org.jboss.jandex"/> <module name="org.jboss.staxmapper"/> <module name="org.jboss.as.controller"/> <module name="org.jboss.as.domain-management"/> <module name="org.jboss.as.server"/> <module name="org.jboss.metadata"/> <module name="org.jboss.modules"/> <module name="org.jboss.msc"/> <module name="org.jboss.vfs"/> <module name="org.jboss.logging"/> <module name="org.scannotation.scannotation" /> <!-- user modules for the plug-in --> <module name="org.hibernate" /> <module name="org.hibernate.envers" /> <module name="org.javassist"/> <module name="org.apache.log4j" /> <module name="org.postgresql"/> </dependencies> </module>
Code for bootstrapping hibernate from the sub module.
ClassLoader currentClassLoader = DbBootstrapDetectorResourceDefinition.class.getClassLoader(); URL resource = classLoader.getResource(hibernateCfg); ClassLoaderService classLoaderService = createClassLoaderService(classLoader,currentClassLoader); DbBootstrapLogger.ROOT_LOGGER.tracef("Using hibernate configuration file %s ",hibernateCfg); Configuration configuration = new Configuration(); configuration.configure(resource); // configures settings from hibernate.cfg.xml SessionFactory sessionFactory = configuration.buildSessionFactory(new ServiceRegistryBuilder( new BootstrapServiceRegistryImpl( classLoaderService, new LinkedHashSet<Integrator>())).applySettings(configuration.getProperties()).buildServiceRegistry()); return sessionFactory.openSession(); private ClassLoaderService createClassLoaderService(ClassLoader classLoader, ClassLoader currentClassLoader) throws Exception{ ClassLoaderService classLoaderService = new ClassLoaderServiceImpl(currentClassLoader, classLoader, classLoader,currentClassLoader); return classLoaderService; }
Thanks
/Flemming