It is pretty close to what I understandood but also means you don't have this resources.xml blocker since you will:
1. check the ear 2. add drivers in tomee/lib 3. append the resource definition in tomee.xml (or another file if you want to use an import for instance or system.properties) 4. start does it sounds like doable? Side note: this is something easily doable with tomee maven plugin Romain Manni-Bucau @rmannibucau <https://twitter.com/rmannibucau> | Blog <https://blog-rmannibucau.rhcloud.com> | Old Blog <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> | LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE Factory <https://javaeefactory-rmannibucau.rhcloud.com> 2017-05-09 14:05 GMT+02:00 Violeta Georgieva <[email protected]>: > 2017-05-09 13:48 GMT+03:00 Romain Manni-Bucau <[email protected]>: > > > > Hmm, feel like I'm missing something so let me dump few pointers > hopefully > > helping to identify that: > > Here is the scenario: > - the user provides its EAR file which may or may not contain a driver > file. > - the first phase is a "staging" phase. During this phase only > configurations will happen. The EAR will be analyzed. > If the EAR doesn't contain a driver for the database (EAR/lib will be > evaluated), a driver will be downloaded and placed in EAR/lib (or > TomEE/lib), otherwise such download will not be performed. > There might be other configuration that will be applied. > - the second phase is the phase when TomEE will be started with all > configurations and additional libraries in place and with the application > of course. > > > > > > - if you don't own the app then you can only customize the server and > > therefore don't hit this limitation, no? > > - how would you handle "if there use it, if not use another one", with > > openejb.classloader.forced-load? > > - I'm still reading it as you customize the container and therefore don't > > hit this issue since you add drivers in the container > > > > > > Romain Manni-Bucau > > @rmannibucau <https://twitter.com/rmannibucau> | Blog > > <https://blog-rmannibucau.rhcloud.com> | Old Blog > > <http://rmannibucau.wordpress.com> | Github < > https://github.com/rmannibucau> | > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE Factory > > <https://javaeefactory-rmannibucau.rhcloud.com> > > > > 2017-05-09 12:45 GMT+02:00 Violeta Georgieva <[email protected]>: > > > > > 2017-05-09 13:24 GMT+03:00 Romain Manni-Bucau <[email protected]>: > > > > > > > > 2017-05-09 12:18 GMT+02:00 Violeta Georgieva <[email protected]>: > > > > > > > > > 2017-05-09 11:32 GMT+03:00 Romain Manni-Bucau < > [email protected] > >: > > > > > > > > > > > > Right, lazy will not activate it early enough for JPA. > > > > > > > > > > > > Issue is we don't have the ear classloader (or webapp ones) when > > > wiring > > > > > the > > > > > > EE application, we can let JPA lazy retrieve the datasource if > needed > > > but > > > > > > will still rely on lazy flag. > > > > > > > > > > Ok > > > > > > > > > > > > > > > > > Side note: think it is still recommanded to not load drivers from > sub > > > JVM > > > > > > classloader cause they can't always be unloaded, isn't it? > > > > > > > > > > My use case is a container that holds TomEE + EAR application. > > > > > When it is started everything is started. > > > > > When it is stopped everything is stopped. > > > > > > > > > > > > > > If you own the container then you can define it in tomee.xml and use > > > > tomee/lib no? Did it get it wrong? > > > > > > I do not own the app. > > > I wanted to achieve the following: > > > - If the app has a driver packaged in an EAR to use it as is > > > - If the app does not have a driver to supply such. > > > > > > > > > > > > > > > > Thanks, > > > > > Violeta > > > > > > > > > > > > > > > > > Romain Manni-Bucau > > > > > > @rmannibucau <https://twitter.com/rmannibucau> | Blog > > > > > > <https://blog-rmannibucau.rhcloud.com> | Old Blog > > > > > > <http://rmannibucau.wordpress.com> | Github < > > > > > https://github.com/rmannibucau> | > > > > > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | JavaEE > Factory > > > > > > <https://javaeefactory-rmannibucau.rhcloud.com> > > > > > > > > > > > > 2017-05-09 10:26 GMT+02:00 Violeta Georgieva < > [email protected] > >: > > > > > > > > > > > > > 2017-05-09 11:04 GMT+03:00 Romain Manni-Bucau < > > > [email protected] > > > >: > > > > > > > > > > > > > > > > Guess you can still use Lazy=true. > > > > > > > > > > > > > > With Lazy flag I'm receiving the exception below. I tried > > > > > > > also UseAppClassLoader = true the exception is the same as > below. > > > > > > > > > > > > > > org.apache.openejb.OpenEJBException: Could not lookup > > > > > <jta-data-source> > > > > > > > 'openejb/Resource/eartest/jdbc/mydb' for unit 'mydb': Unable > to > > > > > resolve > > > > > > > class org.hsqldb.jdbcDriver: Could not lookup <jta-data-source> > > > > > > > 'openejb/Resource/eartest/jdbc/mydb' for unit 'mydb': Unable > to > > > > > resolve > > > > > > > class org.hsqldb.jdbcDriver > > > > > > > at > > > > > > > org.apache.openejb.assembler.classic.Assembler. > > > > > > > createApplication(Assembler.java:1042) > > > > > > > at > > > > > > > org.apache.openejb.assembler.classic.Assembler. > > > > > > > createApplication(Assembler.java:718) > > > > > > > at > > > > > > > org.apache.openejb.assembler.classic.Assembler. > > > > > > > createApplication(Assembler.java:714) > > > > > > > at > > > > > > > org.apache.tomee.catalina.TomcatWebAppBuilder.checkHost( > > > > > > > TomcatWebAppBuilder.java:2223) > > > > > > > at > > > > > > > org.apache.tomee.catalina.GlobalListenerSupport. > lifecycleEvent( > > > > > > > GlobalListenerSupport.java:141) > > > > > > > at > > > > > > > org.apache.catalina.util.LifecycleBase.fireLifecycleEvent( > > > > > > > LifecycleBase.java:94) > > > > > > > at > > > > > > > org.apache.catalina.core.ContainerBase.backgroundProcess( > > > > > > > ContainerBase.java:1164) > > > > > > > at > > > > > > > org.apache.catalina.core.ContainerBase$ > > > ContainerBackgroundProcessor. > > > > > > > processChildren(ContainerBase.java:1388) > > > > > > > at > > > > > > > org.apache.catalina.core.ContainerBase$ > > > ContainerBackgroundProcessor. > > > > > > > processChildren(ContainerBase.java:1392) > > > > > > > at > > > > > > > org.apache.catalina.core.ContainerBase$ > > > ContainerBackgroundProcessor. > > > > > > > run(ContainerBase.java:1360) > > > > > > > at java.lang.Thread.run(Thread.java:745) > > > > > > > Caused by: org.apache.openejb.OpenEJBException: > > > > > > > org.apache.openejb.OpenEJBException: Could not lookup > > > > > <jta-data-source> > > > > > > > 'openejb/Resource/eartest/jdbc/mydb' for unit 'mydb': Unable > to > > > > > resolve > > > > > > > class org.hsqldb.jdbcDriver: Could not lookup <jta-data-source> > > > > > > > 'openejb/Resource/eartest/jdbc/mydb' for unit 'mydb': Unable > to > > > > > resolve > > > > > > > class org.hsqldb.jdbcDriver > > > > > > > at > > > > > > > org.apache.openejb.assembler.classic.Assembler. > > > > > > > createApplication(Assembler.java:873) > > > > > > > ... 10 more > > > > > > > Caused by: org.apache.openejb.OpenEJBException: Could not > lookup > > > > > > > <jta-data-source> 'openejb/Resource/eartest/jdbc/mydb' for > unit > > > > > 'mydb': > > > > > > > Unable to resolve class org.hsqldb.jdbcDriver > > > > > > > at > > > > > > > org.apache.openejb.assembler.classic.PersistenceBuilder. > > > > > > > createEntityManagerFactory(PersistenceBuilder.java:96) > > > > > > > at > > > > > > > org.apache.openejb.assembler.classic.Assembler. > > > > > > > createApplication(Assembler.java:867) > > > > > > > ... 10 more > > > > > > > Caused by: > > > > > > > org.apache.openejb.core.ivm.naming.LazyObjectReference$ > > > > > > > LazyNamingException: > > > > > > > Unable to resolve class org.hsqldb.jdbcDriver > > > > > > > at > > > > > > > org.apache.openejb.core.ivm.naming.LazyObjectReference. > > > > > > > getObject(LazyObjectReference.java:39) > > > > > > > at org.apache.openejb.core.ivm.naming.IvmContext.lookup( > > > > > > > IvmContext.java:176) > > > > > > > at > > > > > > > org.apache.openejb.assembler.classic.PersistenceBuilder. > > > > > > > createEntityManagerFactory(PersistenceBuilder.java:90) > > > > > > > ... 11 more > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 2017-05-09 9:52 GMT+02:00 Violeta Georgieva < > > > [email protected] > > > >: > > > > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > > > > > > > 2017-05-09 10:02 GMT+03:00 Romain Manni-Bucau < > > > > > [email protected] > > > > > >: > > > > > > > > > > > > > > > > > > > > Hi Violeta, > > > > > > > > > > > > > > > > > > > > yes for ears intent was to put the descriptor in META-INF > and > > > the > > > > > > > driver > > > > > > > > > in > > > > > > > > > > ear/lib. That said you can add Lazy=true to support wars. > > > > > > > > > > > > > > > > > > I tried to put the driver in the EAR/lib and the > resources.xml > > > file > > > > > in > > > > > > > > > EAR/META-INF. > > > > > > > > > Unfortunately the driver still cannot be found. (exception > > > below, I > > > > > > > > > intentionally removed the hsqldb from TomEE/lib) > > > > > > > > > > > > > > > > > > Debugging the code I saw that the context class loader was > used > > > > > [1]. > > > > > > > The > > > > > > > > > context class loader was the loader that contains TomEE/lib > and > > > not > > > > > the > > > > > > > > > EAR/lib. > > > > > > > > > > > > > > > > > > Shouldn't it use the EAR class loader? > > > > > > > > > > > > > > > > > > Regards, > > > > > > > > > Violeta > > > > > > > > > > > > > > > > > > [1] > > > > > > > > > https://github.com/apache/tomee/blob/master/container/ > > > > > > > > > openejb-core/src/main/java/org/apache/openejb/assembler/ > > > > > > > > > classic/Assembler.java#L2949 > > > > > > > > > > > > > > > > > > org.apache.xbean.propertyeditor.PropertyEditorException: > > > Unable > > > > > to > > > > > > > > > resolve > > > > > > > > > class org.hsqldb.jdbcDriver > > > > > > > > > at > > > > > > > > > > > > > > > > > > > > > org.apache.xbean.propertyeditor.ClassEditor. > > > toObjectImpl(ClassEditor.java: > > > > > > > > > 43) > > > > > > > > > at > > > > > > > > > org.apache.xbean.propertyeditor. > AbstractConverter.toObject( > > > > > > > > > AbstractConverter.java:86) > > > > > > > > > at > > > > > > > > > org.apache.xbean.propertyeditor.PropertyEditors.getValue( > > > > > > > > > PropertyEditors.java:284) > > > > > > > > > at > > > > > org.apache.xbean.recipe.RecipeHelper.convert( > RecipeHelper.java:181) > > > > > > > > > at > > > > > > > > > org.apache.xbean.recipe.ObjectRecipe. > extractConstructorArgs( > > > > > > > > > ObjectRecipe.java:592) > > > > > > > > > at > > > > > > > > > > > > > > > > > > > > > org.apache.xbean.recipe.ObjectRecipe.internalCreate( > > > ObjectRecipe.java:275) > > > > > > > > > at org.apache.xbean.recipe.AbstractRecipe.create( > > > > > > > AbstractRecipe.java:96) > > > > > > > > > at org.apache.xbean.recipe.AbstractRecipe.create( > > > > > > > AbstractRecipe.java:61) > > > > > > > > > at > > > > > > > > > > > > > > > > > > > > > org.apache.openejb.assembler.classic.Assembler. > > > doCreateResource(Assembler. > > > > > > > > > java:2970) > > > > > > > > > at > > > > > > > > > org.apache.openejb.assembler.classic.Assembler. > > > > > > > > > createResource(Assembler.java:2803) > > > > > > > > > at > > > > > > > > > org.apache.openejb.config.ConfigurationFactory.doInstall( > > > > > > > > > ConfigurationFactory.java:466) > > > > > > > > > at > > > > > > > > > org.apache.openejb.config.ConfigurationFactory.install( > > > > > > > > > ConfigurationFactory.java:459) > > > > > > > > > at > > > > > > > > > > > > > > > > > > > > > org.apache.openejb.config.AutoConfig.installResource( > > > AutoConfig.java:2194) > > > > > > > > > at > > > > > > > > > org.apache.openejb.config.AutoConfig. > > > processApplicationResources( > > > > > > > > > AutoConfig.java:1026) > > > > > > > > > at org.apache.openejb.config.AutoConfig.deploy(AutoConfig. > > > > > java:190) > > > > > > > > > at > > > > > > > > > org.apache.openejb.config.ConfigurationFactory$Chain. > > > > > > > > > deploy(ConfigurationFactory.java:420) > > > > > > > > > at > > > > > > > > > org.apache.openejb.config.ConfigurationFactory. > > > > > configureApplication( > > > > > > > > > ConfigurationFactory.java:1037) > > > > > > > > > at > > > > > > > > > org.apache.tomee.catalina.TomcatWebAppBuilder.checkHost( > > > > > > > > > TomcatWebAppBuilder.java:2204) > > > > > > > > > at > > > > > > > > > org.apache.tomee.catalina.GlobalListenerSupport. > > > lifecycleEvent( > > > > > > > > > GlobalListenerSupport.java:141) > > > > > > > > > at > > > > > > > > > org.apache.catalina.util.LifecycleBase.fireLifecycleEvent( > > > > > > > > > LifecycleBase.java:94) > > > > > > > > > at > > > > > > > > > org.apache.catalina.core.ContainerBase.backgroundProcess( > > > > > > > > > ContainerBase.java:1164) > > > > > > > > > at > > > > > > > > > org.apache.catalina.core.ContainerBase$ > > > > > ContainerBackgroundProcessor. > > > > > > > > > processChildren(ContainerBase.java:1388) > > > > > > > > > at > > > > > > > > > org.apache.catalina.core.ContainerBase$ > > > > > ContainerBackgroundProcessor. > > > > > > > > > processChildren(ContainerBase.java:1392) > > > > > > > > > at > > > > > > > > > org.apache.catalina.core.ContainerBase$ > > > > > ContainerBackgroundProcessor. > > > > > > > > > run(ContainerBase.java:1360) > > > > > > > > > at java.lang.Thread.run(Thread.java:745) > > > > > > > > > Caused by: java.lang.ClassNotFoundException: > > > org.hsqldb.jdbcDriver > > > > > > > > > at > java.net.URLClassLoader.findClass(URLClassLoader.java:381) > > > > > > > > > at java.lang.ClassLoader.loadClass(ClassLoader.java:424) > > > > > > > > > at java.lang.ClassLoader.loadClass(ClassLoader.java:357) > > > > > > > > > at java.lang.Class.forName0(Native Method) > > > > > > > > > at java.lang.Class.forName(Class.java:348) > > > > > > > > > at > > > > > > > > > > > > > > > > > > > > > org.apache.xbean.propertyeditor.ClassEditor. > > > toObjectImpl(ClassEditor.java: > > > > > > > > > 40) > > > > > > > > > ... 24 more > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Romain Manni-Bucau > > > > > > > > > > @rmannibucau <https://twitter.com/rmannibucau> | Blog > > > > > > > > > > <https://blog-rmannibucau.rhcloud.com> | Old Blog > > > > > > > > > > <http://rmannibucau.wordpress.com> | Github < > > > > > > > > > https://github.com/rmannibucau> | > > > > > > > > > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | > JavaEE > > > > > Factory > > > > > > > > > > <https://javaeefactory-rmannibucau.rhcloud.com> > > > > > > > > > > > > > > > > > > > > 2017-05-08 23:04 GMT+02:00 Violeta Georgieva < > > > > > [email protected] > > > > > >: > > > > > > > > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > > > > > > > > > > > I have WAR archive that contains a driver, located in > > > > > WEB-INF/lib > > > > > > > and > > > > > > > > > > > resources.xml, located in WEB-INF. The WAR file is > packaged > > > in > > > > > an > > > > > > > EAR > > > > > > > > > file. > > > > > > > > > > > When I deploy the EAR file I receive an exception that > the > > > > > driver > > > > > > > > > cannot be > > > > > > > > > > > located (ClassNotFoundException). > > > > > > > > > > > Isn't it possible to provide a driver with my WAR > archive? > > > > > > > > > > > I'm using TomEE WebProfile 7.0.3. > > > > > > > > > > > > > > > > > > > > > > Thanks a lot, > > > > > > > > > > > Violeta > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > > View this message in context: > http://tomee-openejb.979440. > > > > > > > > > > > n4.nabble.com/Driver-location- > > > in-an-EAR-file-tp4681675.html > > > > > > > > > > > Sent from the TomEE Users mailing list archive at > > > Nabble.com. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
